如何使运行与芹菜周期性任务的子任务?
问题描述:
我想创建定期任务,它使查询数据库,从数据提供者获取数据,提出一些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。
答
也许这样的事情?
import time
while True:
my_celery_chord()
time.sleep(...)
什么原因添加睡眠?它阻止执行。为什么我们需要无限循环? – Alex
这是我能想到的最简单的解决方案。您将需要某种形式的循环来重新触发任务。我认为芹菜的确提供了定期任务。睡觉,这样它不会经常重新触发。更好的解决方案可以在这里找到(http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html)。 –
对不起@tammo,但我认为你不明白这个问题。我知道如何使用定期任务。问题是:从周期性任务运行子任务的正确方式是什么?直接调用delay或apply_async可能是死锁的原因。 – Alex