#sora#笔记——工作流

#sora#笔记——工作流_第1张图片


这里只对其做简单笔记,group,chord等内容直接看文档


subtask实际上是一个signature,可以到处传递

一种raw的用法是:

>>> from celery import signature

>>> signature('tasks.add', args=(2, 2), countdown=10)

tasks.add(2, 2)

正式用法:

>>> add.subtask((2, 2), countdown=10)

tasks.add(2, 2)

简便用法:

>>> add.s(2, 2)

tasks.add(2, 2)

>>> add.s(2, 2, debug=True)

tasks.add(2, 2, debug=True)


更多例子:

>>> s = add.subtask((2, 2), {'debug': True}, countdown=10)

>>> s.args

(2, 2)

>>> s.kwargs

{'debug': True}

>>> s.options

{'countdown': 10}


>>> add.apply_async(args, kwargs, **options)

>>> add.subtask(args, kwargs, **options).apply_async()

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

>>> add.subtask((2, 2), countdown=1).apply_async()


这种情况将会直接在本地执行:

>>> add(2, 2)

4

>>> add.s(2, 2)()

4


当你用s()时,你不能定义option,只能借助set

>>> add.s(2, 2).set(countdown=1)

proj.tasks.add(2, 2)


很多情况下,参数可以分开提供(这是一个很重要的特性!!!):

>>> partial = add.s(2)          # incomplete signature

>>> partial.delay(4)            # 2 + 4

>>> partial.apply_async((4, ))  # same


>>> s = add.s(2, 2)

>>> s.delay(debug=True)                    # -> add(2, 2, debug=True)

>>> s.apply_async(kwargs={'debug': True})  # same


这种情况下会覆盖原来subtask定义的option:

>>> s = add.subtask((2, 2), countdown=10)

>>> s.apply_async(countdown=1)  # countdown is now 1


你可以通过clone现有的一个带不完全参数subtask去派生新的subtask

>>> s = add.s(2)

proj.tasks.add(2)

>>> s.clone(args=(4, ), kwargs={'debug': True})

proj.tasks.add(2, 4, debug=True)


但是这种情况下是这样的:

>>> c = add.s(32140,32492)

>>> c()

64632

>>> c

proj.agent.add(32140, 32492)

>>> k = c.clone(args=(24,434))

>>> k

proj.agent.add(24, 434, 32140, 32492)        #调用会产生错误

>>> 




通过immutable参数设置使result不可变

>>> add.apply_async((2, 2), link=reset_buffers.subtask(immutable=True))

>>> add.apply_async((2, 2), link=reset_buffers.si())


这里有个例子;

>>> res = (add.si(2,5) | add.si(12,1) | add.si(2,2))()         #在这种情况下,chain只起到把task combine在一起的功能,每个si()都要提供完整参数,否则会出错
>>> res.get()
4
>>> res = (add.si(2,5) | add.si(12,1) | add.si(2,2)).delay()
>>> res.get()
4
>>> res.parent.get()                                           #可以检查chain中各部分的result
13
>>> res.parent.parent.get()
7


link设置的是callback

link的用法如下:

add.apply_async((2, 2), link=other_task.s())


使用link也可以使用分开提供的参数:

>>> add.apply_async((2, 2), link=add.s(8))

相当于(2+2)+8


你可能感兴趣的:(celery)