这是我的代码:
我的任务
from celery.decorators import task
@task()
def add(x, y):
return x + y
使用我的任务
from core.tasks import add
results = []
for i in range(100):
results.append(add.delay(i, i))
问题1
几秒钟后,我将执行以下操作:
for result in results:
print result.result
打印此:
(这些值不会以看起来像模式的形式返回)
None
None
None
None
8
None
None
None
None
18
None
None
None
None
28
None
None
None
None
38
...
第二个干净的操作系统安装设置:
一切都按预期进行,但仍不确定这里发生了什么…
Django管理界面中的任务也随机丢失…
有人知道发生了什么吗? :|
解决方法:
task.delay()是异步的.顺便说一句,整个AMQP都是关于使任务异步的.如果您想要同步行为,那么使用芹菜有什么意义?
from celery.decorators import task
@task()
def add(x, y, results):
results.append(x + y)
------------8<-------------
from core.tasks import add
results = []
for i in range(100):
add.delay(i, i, results)
请等待几秒钟,然后再进行打印(在消费者进行工作时),并注意结果可能会出问题.
方法task.delay将返回celery.result.AsyncResult实例.在使用AsyncResult.result之前,应检查AsyncResult.state == SUCCESS.
您的最终打印循环可能是:
for result in results:
while not result.state.ready():
time.sleep(secs)
if result.state == u'SUCCESS':
print result.result
else:
print "Something Rotten in the State of Denmark..."
(几乎)与以下内容相同:
for result in results:
print result.get()
看一下TaskSets,它们比将结果存储在列表中更好.
在实践中,人们将结果存储在数据库中,并将等待循环放置在客户端中,然后每隔几秒钟通过AJAX锤击服务器直到完成.