这里只对其做简单笔记,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