热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Win10下Celery4.2.1基于redis的部署与错误

Win10下Celery4.2.1基于redis的部署与错误,Go语言社区,Golang程序员人脉社

Celery是一个分布式异步任务的神器,由Python开发但是其通信协议可以支持其它语言。它还可以设置定时任务,设置多个任务队列并路由任务到指定的队列;同时还提供了运行时的一些监控和管理接口。

安装
  • 安装python3.7(官网下载直接安装)
  • 安装celery库(pip install celery)
  • 安装redis库(pip install redis)
配置启动worker

安装完成之后就可以配置celery的测试代码了。首先是clelry的运行配置文件celeryconfig.py(当然你也可以从命令行传入)

BROKER_URL = 'redis://pcma.xxx.com:6379/0'
CELERY_RESULT_BACKEND = 'redis://pcma.xxx.com:6379/0'

CELERY_REDIS_MAX_COnNECTIONS= 4
CELERYD_COnCURRENCY= 4
BROKER_TRANSPORT_OPTIOnS= {'visibility_timeout': 5}    # 5min

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_COnTENT= ['json']  # Ignore other content
CELERY_TIMEZOnE= 'Asia/Shanghai'
CELERY_ENABLE_UTC = True

接着创建celery的worker代码,celery_worker.py

from celery import Celery

app = Celery('celery_work')
app.config_from_object('celeryconfig')

@app.task
def add(x, y):
    return x + y

然后我们就可以启动worker服务了,此后该worker会一直等待任务并执行。具体启动命令如下:

celery -A celery_server worker --loglevel=info

这种方式默认是多进程启动worker。如果你希望使用单进程启动的话,命令如下:

celery -A celery_server worker --loglevel=info -P solo

另外,你还可以使用协程的方式启动。当然首先你需要安装eventlet。(pip install eventlet)

celery -A celery_server worker --loglevel=info -P eventlet
任务调用

worker启动就绪之后,我们要做的事情就是添加要执行的任务。具体代码如下:

from celery_worker import add

result = add.delay(4, 4)

如果你希望能获取到执行的结果,如下接口可以满足你的需求:

result.ready()    # 获取任务执行状态
result.get(timeout=1, propagate=False)    # 获取任务执行结果
result.traceback    # 获取任务执行异常时的堆栈信息

注意:如果你需要获取任务的结果,那边就需要配置CELERY_RESULT_BACKEND选项。否则celery不会存储结果。

问题及解决

由于安装的是celery4.2.1的版本。其中有2个bug需要针对性的解决。

  1. Python 3.7 syntax error: async is a reserved keyword #4849
  2. Unable to run tasks under Windows #4081

第1个是因为async在Python3.7已经是关键字了,但是celery版本没有更新导致的。下一个发布版本中会修复。没有新版本之前,我们只要修改celery文件中的async为另外的字符即可。比如我修改为了async_2。(注意定义和引用需要修改全套的)

第2个是因为windows下没有fork多进程的模块,而celery默认启动方式就是多进程的,并且还用了fork的方式。解决方式有多种:

  • 使用单进程启动方式(上面已列出,另注意CELERYD_CONCURRENCY配置项取消)
  • 在创建celery实例之前,配置系统环境变量。os.environ.setdefault('FORKED_BY_MULTIPROCESSING', '1')
  • 使用协程的方式启动(上面已列出)
问题描述

问题1:

  File "celery/backends/redis.py", line 22
    from . import async, base
                      ^
SyntaxError: invalid syntax

问题2:

[2017-06-08 15:31:49,416: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)',)
Traceback (most recent call last):
File "c:program filespython36libsite-packagesbilliardpool.py", line 359, in workloop
result = (True, prepare_result(fun(*args, **kwargs)))
File "c:program filespython36libsite-packagesceleryapptrace.py", line 518, in _fast_trace_task
tasks, accept, hostname = _loc
ValueError: not enough values to unpack (expected 3, got 0)

了解更多关于测试与Python的文章,请关注testQna公众号!


推荐阅读
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • Linux的uucico命令使用方法及工作模式介绍
    本文介绍了Linux的uucico命令的使用方法和工作模式,包括主动模式和附属模式。uucico是用来处理uucp或uux送到队列的文件传输工具,具有操作简单快捷、实用性强的特点。文章还介绍了uucico命令的参数及其说明,包括-c或--quiet、-C或--ifwork、-D或--nodetach、-e或--loop、-f或--force、-i或--stdin、-I--config、-l或--prompt等。通过本文的学习,读者可以更好地掌握Linux的uucico命令的使用方法。 ... [详细]
  • SpringBoot整合SpringSecurity+JWT实现单点登录
    SpringBoot整合SpringSecurity+JWT实现单点登录,Go语言社区,Golang程序员人脉社 ... [详细]
  • 一次上线事故,30岁+的程序员踩坑经验之谈
    本文主要介绍了一位30岁+的程序员在一次上线事故中踩坑的经验之谈。文章提到了在双十一活动期间,作为一个在线医疗项目,他们进行了优惠折扣活动的升级改造。然而,在上线前的最后一天,由于大量数据请求,导致部分接口出现问题。作者通过部署两台opentsdb来解决问题,但读数据的opentsdb仍然经常假死。作者只能查询最近24小时的数据。这次事故给他带来了很多教训和经验。 ... [详细]
  • wpf+mvvm代码组织结构及实现方式
    本文介绍了wpf+mvvm代码组织结构的由来和实现方式。作者回顾了自己大学时期接触wpf开发和mvvm模式的经历,认为mvvm模式使得开发更加专注于业务且高效。与此同时,作者指出mvvm模式相较于mvc模式的优势。文章还提到了当没有mvvm时处理数据和UI交互的例子,以及前后端分离和组件化的概念。作者希望能够只关注原始数据结构,将数据交给UI自行改变,从而解放劳动力,避免加班。 ... [详细]
  • 本文介绍了在无法联网的情况下,通过下载rpm包离线安装zip和unzip的方法。详细介绍了如何搜索并下载合适的rpm包,以及如何使用rpm命令进行安装。 ... [详细]
  • 本文介绍了协程的概念和意义,以及使用greenlet、yield、asyncio、async/await等技术实现协程编程的方法。同时还介绍了事件循环的作用和使用方法,以及如何使用await关键字和Task对象来实现异步编程。最后还提供了一些快速上手的示例代码。 ... [详细]
  • 巧用arguments在Javascript的函数中有个名为arguments的类数组对象。它看起来是那么的诡异而且名不经传,但众多的Javascript库都使用着它强大的功能。所 ... [详细]
  • 基于分布式锁的防止重复请求解决方案
    一、前言关于重复请求,指的是我们服务端接收到很短的时间内的多个相同内容的重复请求。而这样的重复请求如果是幂等的(每次请求的结果都相同,如查 ... [详细]
  • 图片复制到服务器 方向变了_双服务器热备更新配置文件步骤问题及解决方法
    本文介绍了在将图片复制到服务器并进行方向变换的过程中,双服务器热备更新配置文件所出现的问题及解决方法。通过停止所有服务、更新配置、重启服务等操作,可以避免数据中断和操作不规范导致的问题。同时还提到了注意事项,如Avimet版本的差异以及配置文件和批处理文件的存放路径等。通过严格执行切换步骤,可以成功进行更新操作。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Redis通用指令及数据库操作详解
    本文详细介绍了Redis中的通用指令,包括key的基本操作、扩展操作和查询模式,以及数据库的基本操作和相关操作。同时还解决了key重复问题,并提供了解决方案。文章内容参考了黑马Redis教程。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
author-avatar
mobiledu2502855777
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有