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
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': {}})]
posted @ 2020-12-19 22:04  dos_hello_world  阅读(174)  评论(0)    收藏  举报