2016-10-17 69 views
0

我想创建定期任务,它使查询数据库,从数据提供者获取数据,提出一些API请求,格式化文档并使用其他API发送它们。如何使运行与芹菜周期性任务的子任务?

上一个任务的结果应该链接到下一个任务。我从我必须使用的文档,和弦为了组织链接。

但是,我从文档中得到了什么:不要从任务运行子任务,因为它可能是死锁的原因。

所以,问题是:如何在周期性任务内运行子任务?

@app.task(name='envoy_emit_subscription', ignore_result=False) 
def emit_subscriptions(frequency): 
# resulting queryset is the source for other tasks 
    return Subscription.objects.filter(definition__frequency=1).values_list('pk', flat=True) 



@app.task(name='envoy_query_data_provider', ignore_result=False) 
def query_data_provider(pk): 
    # gets the key from the chain and returns received data 
    return "data" 


@app.task(name='envoy_format_subscription', ignore_result=False) 
def format_subscription(data): 
    # formats documents 
    return "formatted text" 


@app.task(name='envoy_send_subscription', ignore_result=False) 
def send_subscription(text): 
    return send_text_somehow(text) 

对不起noob问题,但我真的是芹菜noob。

回答

0

也许这样的事情?

import time 

while True: 
    my_celery_chord() 
    time.sleep(...) 
+0

什么原因添加睡眠?它阻止执行。为什么我们需要无限循环? – Alex

+0

这是我能想到的最简单的解决方案。您将需要某种形式的循环来重新触发任务。我认为芹菜的确提供了定期任务。睡觉,这样它不会经常重新触发。更好的解决方案可以在这里找到(http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html)。 –

+0

对不起@tammo,但我认为你不明白这个问题。我知道如何使用定期任务。问题是:从周期性任务运行子任务的正确方式是什么?直接调用delay或apply_async可能是死锁的原因。 – Alex