在windows环境利用celery实现简单的任务队列

测试使用环境:

  1、Python==3.6.1

  2、MongoDB==3.6.2

  3、celery==4.1.1

  4、eventlet==0.23.0

 

Celery分为3个部分

    (1)worker部分负责任务的处理,即工作进程(我的理解工作进程就是你写的python代码,当然还包括python调用系统工具功能)

    (2)broker部分负责任务消息的分发以及任务结果的存储,这部分任务主要由中间数据存储系统完成,比如消息队列服务器RabbitMQ、redis、

Amazon SQS、MongoDB、IronMQ等或者关系型数据库,使用关系型数据库依赖sqlalchemy或者django的ORM

    (3)Celery主类,进行任务最开始的指派与执行控制,他可以是单独的python脚本,也可以和其他程序结合,应用到django或者flask等web框架里面以及你能想到的任何应用

 

上代码

  这里将celery封装成一个Python包,结构如下图

 

 

 celery.py

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 """
 5 Celery主类
 6 启动文件名必须为celery.py!!!
 7 """
 8 
 9 from __future__ import absolute_import  # 为兼容Python版本
10 from celery import Celery, platforms
11 
12 platforms.C_FORCE_ROOT = True  # linux环境下,用于开启root也可以启动celery服务,默认是不允许root启动celery的
13 app = Celery(
14     main='celery_tasks',  # celery启动包名称
15     # broker='redis://localhost',
16     # backend='redis://localhost',
17     include=['celery_tasks.tasks', ]  # celery所有任务
18 )
19 app.config_from_object('celery_tasks.config')  # celery使用文件配置
20 
21 if __name__ == '__main__':
22     app.start()

 

 config.py

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 from __future__ import absolute_import
 4 
 5 CELERY_TIMEZONE = 'Asia/Shanghai'
 6 # CELERY_RESULT_BACKEND='redis://localhost:6379/1'
 7 # BROKER_URL='redis://localhost:6379/2'
 8 BROKER_BACKEND = 'mongodb'  # mongodb作为任务队列(或者说是缓存)
 9 BROKER_URL = 'mongodb://localhost:27017/for_celery'  # 队列地址
10 CELERY_RESULT_BACKEND = 'mongodb://localhost:27017/for_celery'  # 消息结果存储地址
11 CELERY_MONGODB_BACKEND_SETTINGS = {  # 消息结果存储配置
12     'host': 'localhost',
13     'port': 27017,
14     'database': 'for_celery',
15     # 'user':'root',
16     # 'password':'root1234',
17     'taskmeta_collection': 'task_meta',  # 任务结果的存放collection
18 }
19 CELERY_ROUTES = {  # 配置任务的先后顺序
20     'celery_task.tasks.add': {'queue': 'for_add', 'router_key': 'for_add'},
21     'celery_task.tasks.subtract': {'queue': 'for_subtract', 'router_key': 'for_subtract'}
22 }

 

tasks.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
worker部分
"""

from __future__ import absolute_import
from celery import Celery, group
from .celery import app
from time import sleep


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


@app.task
def substract(x, y):
    sleep(5)
    return x - y

  

 

 接下来演示,演示之前先把config中mongdb的用到的database和collection配置好,并启动mongodb服务

 

首先启动consumer

 

 注意启动目录为celery_tasks同一级,启动命令为

celery -A celery_tasks worker --loglevel=info -P eventlet

参数解释,命令中-A参数表示的是Celery APP的名称celery_tasks,这个实例中指的就是tasks.py,后面的tasks就是APP的名称,worker是一个执行任务角色,后面的loglevel=info记录日志类型默认是info,这个命令启动了一个worker,用来执行程序中add这个加法任务(task),-P eventlet是防止在windows环境下出现

[2018-06-02 15:08:15,550: ERROR/MainProcess] Task handler raised error: ValueError('not enough values to unpack (expected 3, got 0)',)

Traceback (most recent call last):

File "d:\programmingsoftware\python35\lib\site-packages\billiard\pool.py", line 358, in workloop result = (True, prepare_result(fun(*args, **kwargs)))

File "d:\programmingsoftware\python35\lib\site-packages\celery\app\trace.py", line 525, in _fast_trace_task tasks, accept, hostname = _loc

ValueError: not enough values to unpack (expected 3, got 0)

若启动成功,结果如下

 

 

 再启动produce

在另一个终端terminal,首先启动Python

如下

再导入并调用任务,使用delay方法

如下

 

 调用之后,回到consumer终端,发现

 

 收到任务。

再到mongodb中查看任务结果

 

 

 

 

 

 

 

 

 

posted @ 2018-06-02 16:25  ALXPS  阅读(4259)  评论(1编辑  收藏  举报