专栏首页sktjpython celery(并行编程 31)

python celery(并行编程 31)

import time from celery import Celery

broker = 'redis://127.0.0.1:6379/1' backend = 'redis://127.0.0.1:6379/2' app = Celery('my_tasks', broker=broker, backend=backend)

@app.task def add(x, y): print('enter task') time.sleep(3) return x + y if name == 'main': print('start task') result = add.delay(3, 18) print('end task') print(result)

broker 指定任务队列的消息中间件,backend 指定了任务执行结果的存储。

@app.task 注册任务 add.delay调用

@app.task(name='task.add', serializer='json')

在对象中添加:

logger = get_task_logger(name)

@task(bind=True) def add(self, x, y): logger.info(self.request.id)

task参数列表:http://docs.celeryproject.org/en/latest/userguide/tasks.html#task-options

任务执行,10秒后 apply_async()

add.apply_async((1, 2), countdown=10)

任务执行

  1. delay, 用来进行最简单便捷的任务执行;
  2. apply_async, 对于任务的执行附加额外的参数,对任务进行控制;
  3. app.send_task, 可以执行未在 Celery 中进行注册的任务

重载task

import celery

class MyTask(celery.Task):

def on_failure(self, exc, task_id, args, kwargs, einfo):
    print('{0!r} failed: {1!r}'.format(task_id, exc))

@task(base=MyTask) def add(x, y): raise KeyError()

  • after_return:在任务执行返回后交给 worker 执行
  • on_failure:在任务执行失败后交给 worker 执行
  • on_retry:在任务进行重试是交给 worker 执行
  • on_success:在任务执行成功后交给 worker 执行

工作流:上一次执行的结果传递到下一次

from celery import chain result = chain(add.s(1, 2), add.s(3), add.s(4)) # 1+2+3+4 result().get() 10

group 任务的并发执行:

from celery import group group(add.s(1, 2), add.s(3,4), add.s(5,6))().get() [3, 7, 11]

chord将执行的结果回调:

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

from celery import chord chord((add.s(i, i) for i in xrange(10)), xsum.s())().get() # xsum 收到 [2,4,6,...,18] 90

chunks 大任务分小

add.chunks(zip(range(100), range(100)), 10)().get()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • IOS 重载UIControl控件

    class CustomControl:UIControl { override func sendAction(action:Selector, to ta...

    用户5760343
  • python3 函数和lambda

    用户5760343
  • Go html/tempalte 生成html

    用户5760343
  • Spring JMS各组件详解

    在上一篇文章使用Spring/Spring Boot集成JMS的陷阱中讲到了在使用Spring JMS组件时存在这一些性能陷阱,本文会着该文讲解一下Spring...

    颇忒脱
  • 水晶报表常用公式

    A.计量单位转换 这是一个非常简单的例子,主要是为了演示在公式中进行不同变量类型的转换和计算。 有时数据库字段的单位和报表中显示的单位不...

    斯文的程序
  • #12 Python函数

    矩形的面积 S = ab,只要知道任一矩形的的长和宽,就可以带入上式求得面积。这样有什么好处呢?一个公式,适用于全部矩形,一个公式,重复利用,减少了大脑的记忆负...

    py3study
  • 实时获取Python的print输出流

    我的应用场景是:使用shell执行python文件,并且通过调用的返回值获取python的标准输出流。 shell程序如下:

    py3study
  • java 序列化 原理解析

    java404
  • php 反序列漏洞初识

    在 OWASP TOP10 中,反序列化已经榜上有名,但是究竟什么是反序列化,我觉得应该进下心来好好思考下。我觉得学习的时候,所有的问题都应该问 3 个问题:w...

    信安之路
  • 序列化和反序列化漏洞的简单理解

    便于保存在内存、文件、数据库中;反序列化即逆过程,由字节流还原成对象。Java中的ObjectOutputStream类的writeObject()方法可以实现...

    哲洛不闹

扫码关注云+社区

领取腾讯云代金券