【问题标题】:Celery tasks vanishing - Django/Celery芹菜任务消失 - Django/Celery
【发布时间】:2011-05-31 08:08:11
【问题描述】:

这是我的代码:

我的任务

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 管理界面中的任务也随机丢失...


有人知道发生了什么吗? :|

【问题讨论】:

    标签: python django message-queue celery


    【解决方案1】:

    task.delay() 是异步的。顺便说一句,整个 AMQP 都是关于使任务异步的。如果你想要同步行为,那么使用 celery 有什么意义呢?

    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 敲击服务器,直到完成。

    【讨论】:

    • @Paulo:感谢您的回复!我想说的是,任务保持在PENDING 状态并且永远不会转向SUCCESS...,并且任务之间似乎存在一种模式。我同意您在回复中提出的所有观点,但我仍然无法让这些任务返回值。
    • @Paulo:顺便说一句,您知道为什么某些任务无法被 cam 拾取吗?会不会是他们被处决的速度太快了以至于不能咳嗽?
    • @RadiantHex:假设您有 task.ignore_result == False,当您使用 result.get() 而不是 result.result 时会发生什么?
    • @RadiantHex:看/path/to/yourapp/manage.py celeryd -l info怎么样?有什么提示吗?
    • @RadiantHex:没有看到你的结果就很难判断。 BTW,你头像里的美女是谁?
    猜你喜欢
    • 2014-04-16
    • 1970-01-01
    • 2012-09-28
    • 2016-10-14
    • 2021-10-01
    • 2016-08-25
    • 2014-03-16
    • 2012-07-30
    • 2019-09-25
    相关资源
    最近更新 更多