参考:https://blog.csdn.net/tichimi3375/article/details/82415412

中文翻译:https://www.celerycn.io/      https://blog.csdn.net/weixin_40475396/article/details/80439781

官网:http://docs.celeryproject.org/en/latest/index.html

注意事项:

1 cd到tasks.py同级目录中,执行命令

2 导入配置的一种方式

3 my_task.apply_async((2, 2), queue='my_queue', countdown=10) 任务my_task将会被发送到my_queue队列中,并且在发送10秒之后执行。

4

5

group: 一组任务并行执行,返回一组返回值,并可以按顺序检索返回值。

  chain: 任务一个一个执行,一个执行完将执行return结果传递给下一个任务函数

from proj.tasks import my_task1
from proj.tasks import my_task2
from proj.tasks import my_task3
from celery import group # 将多个signature放入同一组中
my_group = group((my_task1.s(, ), my_task2.s(, ), my_task3.s(, )))
ret = my_group() # 执行组任务
print(ret.get()) # 输出每个任务结果
from proj.tasks import my_task1
from proj.tasks import my_task2
from proj.tasks import my_task3
from celery import chain # 将多个signature组成一个任务链
# my_task1的运行结果将会传递给my_task2
# my_task2的运行结果会传递给my_task3
my_chain = chain(my_task1.s(, ) | my_task2.s() | my_task3.s())
ret = my_chain() # 执行任务链
print(ret.get()) # 输出最终结果

6 my_task1.apply_async(queue='queue1')通过apply_aynsc()方法来设置任务发送到那个队列中

7 celery -A proj worker --loglevel=info -Q queue1,queue2 设置一个worker服务器处理两个队列中的任务

8 celery beat是一个调度器,它可以周期内指定某个worker来执行某个任务。

启动woker处理周期性任务: celery -A proj worker --loglevel=info --beat

beat_schedule = {
'every-5-minute':
{
'task': 'proj.tasks.period_task',
'schedule': 5.0,
'args': (, ),
},
'add-every-monday-morning': {
'task': 'proj.tasks.period_task',
'schedule': crontab(hour=, minute=, day_of_week=),
'args': (, ),
}, }

9

from celery import Celery

# 创建celery实例
app = Celery('demo')
app.config_from_object('proj.celeryconfig') # 自动搜索任务
app.autodiscover_tasks(['proj'])

 10 定义app时要指定名称,否则如下

当这个模块运行,任务将以前缀 __main__ 命名,但是当该模块被其他进程引入来运行一个任务,这个任务的名称将以前缀 tasks 命名(即这个模块的真实名称)

【app名称不指定,则task的名称不固定,就不方便根据任务名称映射出实际任务函数】

from celery import Celery
app = Celery() --app未指定名称 @app.task
def add(x, y): return x + y if __name__ == '__main__':
app.worker_main()

最佳实践如下:

>>> app = Celery('tasks')
>>> app.main
'tasks' >>> @app.task
... def add(x, y):
... return x + y >>> add.name
tasks.add

参考:https://blog.csdn.net/libing_thinking/article/details/78541171

11 客户端导入模块 myapp.tasks 时使用 .tasks ,而工作单元导入模块使用 myapp.tasks, 他们产生的名称会不匹配,任务调用时工作单元会报 NotRegistered 错误。

>>> from project.myapp.tasks import mytask
>>> mytask.name
'project.myapp.tasks.mytask' >>> from myapp.tasks import mytask
>>> mytask.name
'myapp.tasks.mytask'

基于这一点,你必须在导入模块时保持一致,这也是 python 的最佳实践

参考:https://blog.csdn.net/libing_thinking/article/details/78547816

12

celery_demo                    # 项目根目录
├── celery_app # 存放 celery 相关文件
│ ├── __init__.py
│ ├── celeryconfig.py # 配置文件
│ ├── task1.py # 任务文件
│ └── task2.py # 任务文件
└── client.py # 应用程序

执行 python client.py 就生产出了task

在celery_demo 目录下执行 celery worker -A celery_app -l info -Q email 就执行了任务

13

https://www.cnblogs.com/kangoroo/p/6588615.html

from celery.app.task import Task

class CallbackTask(Task):

    def __init__(self):
super(CallbackTask, self).__init__() def on_success(self, retval, task_id, args, kwargs):
try:
item_param= json.loads(args[])
logger.info('[task_id] %s, [task_type] %s, finished successfully.' % (task_id, item_param.get('task_type')))
except Exception, ex:
logger.error(traceback.format_exc()) def on_failure(self, exc, task_id, args, kwargs, einfo):
try:
item_param = json.loads(args[])
logger.error(('Task {0} raised exception: {1!r}\n{2!r}'.format(
task_id, exc, einfo.traceback)))
except Exception, ex:
logger.error(traceback.format_exc())
from celery import task
from common.callback import CallbackTask logger = logging.getLogger(__name__) @task(base=CallbackTask)
def quota_check(item_param):
logger.info('start')
return

14

result = add.delay(44)

>>> result.ready()
False

You can wait for the result to complete, but this is rarely used since it turns the asynchronous call into a synchronous one:

>>> result.get(timeout=1)
8

In case the task raised an exception, get() will re-raise the exception, but you can override this by specifying the propagate argument:

>>> result.get(propagate=False)

If the task raised an exception you can also gain access to the original traceback:

>>> result.traceback

15 添加定时任务的一种方法
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)
另一种方法:
Example: Run the tasks.add task every seconds. app.conf.beat_schedule = {
'add-every-30-seconds': {
'task': 'tasks.add',
'schedule': 30.0,
'args': (, )
},
}
app.conf.timezone = 'UTC'

16 查看结果:

from celery.result import AsyncResult
from celery_app_task import cel async = AsyncResult(id="e919d97d-2938-4d0f-9265-fd8237dc2aa3", app=cel) if async.successful():
result = async.get()
print(result)
# result.forget() # 将结果删除
elif async.failed():
print('执行失败')
elif async.status == 'PENDING':
print('任务等待中被执行')
elif async.status == 'RETRY':
print('任务异常后正在重试')
elif async.status == 'STARTED':
print('任务已经开始被执行') ==========================

ret=task1.add.apply_async(args=[2, 8],queue="email",routing_key="email")
print('hello world')
print(ret.status)
print(ret.id)

print(ret.result) # NONE
print(ret.get()) #没有加timeout,所以阻塞住了,直到返回结果10
print(ret.result) # 10

17

 

celery 笔记的更多相关文章

  1. Celery笔记

    异步任务神器 Celery 简明笔记 2016/12/19 · 工具与框架 · Celery, 异步 原文出处: FunHacks    在程序的运行过程中,我们经常会碰到一些耗时耗资源的操作,为了避 ...

  2. celery 学习笔记 01-介绍

    celery 学习笔记 01-介绍 celery 是 python 中的常用的任务队列框架,经常用于异步调用.后台任务等工作.celery 本身以 python 写,但协议可在不同的语言中实现,其它语 ...

  3. 异步任务神器 Celery 简明笔记

    转自:http://www.jianshu.com/p/1840035cb510 异步任务 异步任务是web开发中一个很常见的方法.对于一些耗时耗资源的操作,往往从主应用中隔离,通过异步的方式执行.简 ...

  4. Celery配置实践笔记

    说点什么: 整理下工作中配置celery的一些实践,写在这里,一方面是备忘,另外一方面是整理成文档给其他同事使用. 演示用的项目,同时也发布在Github上: https://github.com/b ...

  5. Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步

    Django商城项目笔记No.4用户部分-注册接口-短信验证码实现celery异步 接上一篇,如何解决前后端请求跨域问题? 首先想一下,为什么图片验证码请求的也是后端的api.meiduo.site: ...

  6. Celery 框架学习笔记

    在学习Celery之前,我先简单的去了解了一下什么是生产者消费者模式. 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是 ...

  7. python学习笔记3-celery分布式任务处理器

    celery是用python写的一个异步的任务框架,功能非常强大,具体的说明可以查看官网,这里主要提供点demo让你迅速使用该框架   1.环境安装 默认安装好了redis pip install c ...

  8. Celery学习笔记

    转载请注明出处:点我 我的第一篇博客!嘿嘿! 在公司实习,接触到的第一个项目就用到了Celery,之前是完全没有接触过Celery这玩意,然后花了点时间仔细的研究了下怎么用.在学习过程中也遇到了些问题 ...

  9. celery学习笔记2

    1.定义: Celery是一个异步的任务队列(也叫做分布式任务队列) 2.工作结构 Celery分为3个部分 (1)worker部分负责任务的处理,即工作进程(我的理解工作进程就是你写的python代 ...

随机推荐

  1. 配置Hive数据仓库

    1.在线安装mysql服务 #下载安装mysql yum install mysql mysql-server mysql-devel #启动mysql服务 cd /etc/ init.d/mysql ...

  2. LeetCode 278. 第一个错误的版本(First Bad Version)

    278. 第一个错误的版本 LeetCode278. First Bad Version 题目描述 你是产品经理,目前正在带领一个团队开发新的产品.不幸的是,你的产品的最新版本没有通过质量检测.由于每 ...

  3. .NET Core 配置文件

    老一代配置系统 1,XML格式 格式单一. 2,配置信息Kye,只能一维化配置 3,框架信息和应用程序信息混合到一起 应用程序中是 App.config web项目中           web.co ...

  4. JAVA线程中的发牌题

    发牌题主要考虑的就是线程的问题,一个buffer缓冲区的问题, 首先,发牌的优先级当然是最高的了,但是取牌不能有优先级,否则会一直有牌先取,因此需要一个信号量order,当order=线程的数字时,取 ...

  5. (一)构建基于ubuntu docker MySQL 5.6 镜像并推送到Docker Hub

    一,创建目录二,文件准备三,构建四,使用五,在宿主机上连接docker 中的mysql六,推送镜像到Docker hub 一,创建目录 mkdir -p mysql/5.6 二,文件准备 注意执行脚本 ...

  6. 刷新ip地址 windows linux系统

    linux:使用dhcp去更新ip与释放ip 释放ip: dhclient -r eth0 (释放eth0的ip) 更新ip : dhclient eth0 (针对eth0,请求新的ip) windo ...

  7. 在论坛中出现的比较难的sql问题:11(字符分拆 多关键字匹配问题)

    原文:在论坛中出现的比较难的sql问题:11(字符分拆 多关键字匹配问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  8. iptables的nat规则骚操作

    水一枪 我对防火墙这块的认知是比较低的, 之前一直没怎么去用 最多的要么就是 iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A OUT ...

  9. Windows环境下实现Jenkins自动化部署

    详见:https://blog.csdn.net/Try_harder_every_day/article/details/79170065 Jenkins自动化部署: 几条具体的思路:1.开发人员将 ...

  10. 阿里P7详细解答JVM性能调优之监控工具

    javap 和 javac javac -verbose 类名.java java -verbose 类名 javap -c 类名 javap -verbose 类名 JAVAP -HELP 用法: ...