celery模块
依赖包安装
pip install celery
pip install redis
Celery快速入门
Celery搭建
Broker模块支持
Celery异步并发框架,包括了broker,worker,backend三部分。Broker为celery提供了队列支持,目前broker模块仅仅支持rabbitMQ和redis。这里选择redis。
Redis下载安装
Backend模块支持
Celery使用broker做为任务队列为用户提供任务缓存,使用worker从任务队列获取任务并执行,最后使用backend将任务执行结果存储到backend指定的存储中。用户可以通过返回值,获取任务状态。
python库安装
celery安装
pip install celery
redis安装
pip install redis
简单实例
Celery中各个模块图例
celery中各个参与者介绍
准备测试代码
在目录/lovelsl/celery/simple下,新建两个文件tasks.py和test.py分别用于消费者和生产者。以下的操作也在该目录下执行。
task.py内容如下:
from tasks import add
add.delay(4,4)
tasks.py内容如下:
from celery import Celery
#第一个参数,必须与文件名相同
app = Celery('tasks', broker='redis://127.0.0.1:6379/0')
@app.task
def add(x, y):
return x + y
消费者生成
在一个命令行窗口下执行:
celery -A tasks worker --loglevel=info
执行命令后会生成消费者进程,-A 指定消费的celeryapp名为tasks(当前路径下的tasks文件),--loglevel=info指定显示所有信息。
生产者产生任务
在另一个命令行窗口下执行:
python test.py
程序调用add.delay之后,任务add进入broker队列。同时可以在消费者窗口下,看到执行结果为8。
任务执行结果:
因为没有指定任务存储的地点,所以test.py中只有向broker中提交任务,而没有从backend中获取任务结果的部分。
Celery分离部署
常见指令操作
celery worker 常见参数
-A 指定celery app名,一般该名字与定义task的文件名一致。
-Q 指定celery worker从那个队列获取任务,默认default为celery队列
-l 指定显示消息等级,多如此用-l info,用于显示处理流程
-n 指定celery worker的进程名,如自定义名.%h,%h标示机器名,其它参数见帮助
Celery高级操作
从配置文件中读取celery配置
Celery支持从配置文件读取celery配置参数。
路由使用实例(route)
在/lovelsl/celery/celeryapp文件夹下,新建三个文件,celeryconfig.py,tasks.py,test.py。
其中celeryconfig.py为celery配置文件,tasks.py是任务文件用于模拟消费者,test.py是生产这,用于向borker生成任务。
Celery的queue定义:
Celery的queue使用了AMQP消息路由协议。即存在多个消息队列时,由Exchange负责,按照指定的routing_key,将消息发送到指定的消息队列中。
Celery官网给了一个RabbitMQ的例子,定义一个video队列,并将消息路由到该队列中:
{'exchange': 'video', 'exchange_type': 'direct', 'routing_key': 'video'}
由于Redis不支持AMQP协议,在配置时必须保证exchange值与queue值必须一致。
Route使用实例
代码内容
celeryconfig.py内容如下:
from kombu import Exchange, Queue
broker_url = 'redis://192.168.6.190:6379/0'
task_queue = (
Queue("default", Exchange("default"), routing_key="default"),
Queue("for_task_A", Exchange("for_task_A"), routing_key="for_task_A"),
Queue("for_task_B", Exchange("for_task_B"), routing_key="for_task_B"),
)
task_routes = {
'tasks.taskA': {"queue": "for_task_A", "routing_key": "for_task_A"},
'tasks.taskB': {"queue": "for_task_B", "routing_key": "for_task_B"},
}
tasks.py内容如下:
from celery import Celery
app = Celery()
app.config_from_object("celeryconfig")
@app.task
def taskA(x, y):
return x+y
@app.task
def taskB(x, y, z):
return x+y+z
@app.task
def add(x, y):
return x*y
test.py内容如下
from tasks import *
taskA.delay(1, 2)
taskB.delay(1, 2, 3)
add.delay(1, 2)
模拟消息队列
模拟操作:
在路径/lovelsl/celery/celeryapp下执行如下操作:
命令行窗口一:消费者
celery -A tasks worker -l info -n workerA.%h -Q for_task_A
命令行窗口二:消费者
celery -A tasks worker -l info -n workerB.%h -Q for_task_B
命令行窗口三:消费者
celery -A tasks worker -l info
命令行窗口四:生产者
python test.py
查阅结果:
窗口一:
窗口二:
窗口三:
Worker进程查看
以上仅仅列出了前两个worker的进程名,第三个是默认的没有列出
结论:
以上代码实现了,将不同的任务分配到不同的消息队列,并交给不同的消费者消费。
Avcelery文件夹下:
celery -A avcelery worker -l info -n sandbox -Q sandbox
celery -A avcelery worker -l info -n quickly -Q quickly
以上是小写L
ssdeep问题
File "/usr/lib/python3.6/site-packages/ply/yacc.py", line 2979, in signature
digest = base64.b16encode(sig.digest())
在ssdeep的2979行,存在一个问题,在发生意外时不存在sig,需要补充一个sig写在except中
[2020-07-31 17:26:00,710: WARNING/ForkPoolWorker-8] [('/lovelsl/avcloud/celeryproj/quickly/tmp/d7fe288c-d30fc7da58/4b5c040dc2577c9d0f96c146827d001ddbae6c178e97e770b9b5ae59a02a8f9e', {'ssdeep_hash': '24576:uzD5urNhRWxW6/ye0PIphrp9Zuvjqa0UidV', 'chunksize': 24576, 'chunk': 'uzD5urNhRWx2Mk4JJQByw7Imlq3g495S0PwbphrpgXXOZuv/rTWidV', 'analyzed': 'false', 'matches': {}})]

浙公网安备 33010602011771号