Sla*_*wek 5 python task celery
我正在尝试使用 Cellery 进行应用。它应该适用于少数工人,并且不同的工人从不同的队列中消费。我有这样的事情:
@celery.task
def task1():
do_something()
task2.delay()
@celery.task
def task2()
do_something()
Run Code Online (Sandbox Code Playgroud)
所以在worker1上运行的task1应该调用task2,它应该被发送到消耗worker2的队列。问题是它不起作用。我收到了 AsyncResult 的 id,但这个任务的状态一直是 PENDING。当我从 python 控制台手动调用 task2 时,它工作正常。也许我做错了什么,不可能从另一个任务运行一项任务?还有一件事情。Worker1 正在执行 task1 并将 task2 发送到他不消费的队列 - 从这个队列只消费 worker2
这是一个简单的例子,我认为它可以实现你想要的。
from celery import Celery
import random
import string
celery = Celery('two_q',backend='amqp',broker='amqp://guest@localhost//')
@celery.task
def generate_rand_string(n):
# n = number of characters
rand_str = "".join([random.choice(string.lowercase) for i in range(n)])
#calls the second task and adds it to second queue
reverse.apply_async((rand_str,),queue="q2")
print rand_str
return rand_str
@celery.task
def reverse(s):
print s[::-1]
return s[::-1]
generate_rand_string.apply_async((10,), queue="q1")
Run Code Online (Sandbox Code Playgroud)
当使用指定队列列表的 -Q 参数调用时
celery worker --app=two_q -l info -Q q1,q2
Run Code Online (Sandbox Code Playgroud)
它产生以下输出:
pawel@iqmxma82x7:~/py/celery$ celery worker --app=two_q -l info -Q q1,q2
-------------- celery@iqmxma82x7 v3.0.23 (Chiastic Slide)
---- **** -----
--- * *** * -- Linux-3.2.0-54-generic-pae-i686-with-Ubuntu-12.04-precise
-- * - **** ---
- ** ---------- [config]
- ** ---------- .> broker: amqp://guest@localhost:5672//
- ** ---------- .> app: cel_group:0x9bfef8c
- ** ---------- .> concurrency: 4 (processes)
- *** --- * --- .> events: OFF (enable -E to monitor this worker)
-- ******* ----
--- ***** ----- [queues]
-------------- .> q1: exchange:q1(direct) binding:q1
.> q2: exchange:q2(direct) binding:q2
[Tasks]
. two_q.generate_rand_string
. two_q.reverse
[2013-09-15 19:10:35,708: WARNING/MainProcess] celery@iqmxma82x7 ready.
[2013-09-15 19:10:35,716: INFO/MainProcess] consumer: Connected to amqp://guest@127.0.0.1:5672//.
[2013-09-15 19:10:40,731: INFO/MainProcess] Got task from broker: two_q.generate_rand_string[fa2ad56e-c66d-44a9-b908-2d95b2c9e5f3]
[2013-09-15 19:10:40,767: WARNING/PoolWorker-1] jjikjkepkc
[2013-09-15 19:10:40,768: INFO/MainProcess] Got task from broker: two_q.reverse[f52a8247-4674-4183-a826-d73cef1b64d4]
[2013-09-15 19:10:40,770: INFO/MainProcess] Task two_q.generate_rand_string[fa2ad56e-c66d-44a9-b908-2d95b2c9e5f3] succeeded in 0.0217289924622s: 'jjikjkepkc'
[2013-09-15 19:10:40,782: WARNING/PoolWorker-3] ckpekjkijj
[2013-09-15 19:10:40,801: INFO/MainProcess] Task two_q.reverse[f52a8247-4674-4183-a826-d73cef1b64d4] succeeded in 0.0195469856262s: 'ckpekjkijj'
Run Code Online (Sandbox Code Playgroud)
您将获得两个队列(q1,q2)和两个工作人员。
作为比较,如果您不带 -Q 参数或仅使用一个队列调用它:
celery worker --app=two_q -l info
Run Code Online (Sandbox Code Playgroud)
“反向”任务不会被调用,因为 celery 不知道添加它的 q2。
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
1342 次 |
| 最近记录: |