编程语言
首页 > 编程语言> > python-Celery任务消失-Django / Celery

python-Celery任务消失-Django / Celery

作者:互联网

这是我的代码:

我的任务

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锤击服务器直到完成.

标签:celery,message-queue,python,django
来源: https://codeday.me/bug/20191105/1996048.html