celery分布式任务运算

解释器:D:\360Downloads\py
基于python开发的分布式异步消息任务队列,可以轻松的实现任务的异步处理, 如果业务场景中需要用到异步任务,就可以考虑使用celery。Celery 在执行任务时需要通过一个消息中间件来接收和发送任务消息,以及存储任务结果, 一般使用rabbitMQ or Redi。当任务执行失败或执行过程中发生连接中断,celery 会自动尝试重新执行任务。

Celery 4.x及以上不支持windows10

一、使用celery

1.工作流程 rabbitmq为broker 中间商
任务发送者发送任务给celery,celery返回给一个任务id,celery将任务发送给rabbitmq,worker在rabbittmq中取任务,完成后返回给rabbittmq,取结果时也是通过celery。Celery的默认broker是RabbitMQ。

2.安装

pip install celery

3.创建任务 celery_test

from celery import Celery
# tasks是给app起的名字
app = Celery('tasks',
             broker='redis://localhost',
             backend='redis://localhost') # backend 将结果写入redis
@app.task # 这是worker可以执行的任务
def add(x, y):
	print("running...", x, y)
	return x + y
@app.task
def cmd(cmdstr):
	print(cmdstr)

4.启动Celery Worker开始监听并执行任务,在pycharm终端里

celery -A celery_test worker --loglevel=info

5.再打开一个cmd, 进行命令行模式,调用任务

在项目里开一个cmd命令框,输入python后,进行以下操作

from celery_test import add
# 发给远程执行
t1 = add.delay(4, 4)
t1.get() # 拿取执行结果,没有返回就阻塞
t1.get(timeout=1) # 不等待执行完毕,如果没有执行完毕 返回异常
t1.ready() # 检测是否执行完毕

二、在项目中使用celery
1.目录如下

proj/__init__.py
    /celery1.py
    /tasks.py

2.celery1.py内容

# 从python的安装包里导入
# from __future__ import absolute_import, unicode_literals
from celery import Celery

app = Celery('tasks',
             # broker='amqp://',
             # backend='amqp://',
             broker='redis://localhost',
             backend='redis://localhost',
             include=['tasks'])

# Optional configuration, see the application user guide.
app.conf.update(
	result_expires=3600,
)

if __name__ == '__main__':
	app.start( )

3.tasks.py中的内容

# from __future__ import absolute_import, unicode_literals
# from .celery1 import app
from celery1 import app

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

@app.task
def mul(x, y):
    return x * y

@app.task
def xsum(numbers):
    return sum(numbers)

4.启动worker

celery -A tasks worker --loglevel=info

5.再打开cmd运行同上

from tasks import add
# 发给远程执行
t1 = add.delay(4, 4)
t2 = mul.delay(4, 4)
t1.get() # 拿取执行结果,没有返回就阻塞
t1.get(timeout=1) # 不等待执行完毕,如果没有执行完毕 返回异常
t1.ready() # 检测是否执行完毕

三、定时任务
celery支持定时任务,设定好任务的执行时间,celery就会定时自动执行, 这个定时任务模块叫celery beat

periodic_task.py

from celery import Celery
from celery.schedules import crontab
app = Celery()

@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
    # Calls test('hello') every 10 seconds.
    sender.add_periodic_task(10.0, test.s('hello'), name='add every 10')
    # Calls test('world') every 30 seconds
    sender.add_periodic_task(30.0, test.s('world'), expires=10)
    # Executes every Monday morning at 7:30 a.m.
    sender.add_periodic_task(
        crontab(hour=7, minute=30, day_of_week=1),
        test.s('Happy Mondays!'),
    )
@app.task
def test(arg):
    print(arg)

将proj.periodic_task加入celery1.py的app = Celery中,include=['tasks','periodic_task'],启动任务调度器 celery beat

celery -A  periodic_task beat

启动celery worker来执行任务

celery -A periodic_task worker
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值