我正在尝试使用Celery来处理后台任务。我目前有以下设置:
@app.task
def test_subtask(id):
print('test_st:', id)
@app.task
def test_maintask():
print('test_maintask')
g = group(test_subtask.s(id) for id in range(10))
g.delay()
test_maintask
计划执行每个 n 秒,这有效(我看到打印语句出现在我启动worker的命令行窗口中)。我想要做的是让这个计划任务产生一系列子任务,我在这里使用group()
分组。
test_subtask
任务正在被执行。我究竟做错了什么?我对这些子任务没有任何时序/结果限制,只是希望它们从现在起一段时间内发生,异步,没有特定的顺序。 n 秒后,test_maintask
将再次触发(并再次),但没有任何子任务执行。
我正在使用一名工作人员,一个节拍和AMQP作为经纪人(在另一台机器上)。
编辑:对于它的价值,问题似乎完全是因为一个任务调用另一个(而不是因为正在安排的主要任务)。如果我手动调用主要任务:
celery_funcs.test_maintask.delay()
我看到主要任务的打印语句但是 - 再次 - 不是子任务。直接调用子任务确实有效:
celery_funcs.test_subtask.delay(10)
答案 0 :(得分:0)
叹息......刚刚找到答案,我使用以下内容配置我的Celery应用程序:
app = Celery('celery_app', broker='<my_broker_here>')
奇怪的是,这并没有被任务本身所取代......也就是说,
print('test_maintask using broker', app.conf.BROKER_URL, current_app.conf.BROKER_URL)
分别返回'<my_broker_here>'
和None
,导致该组被发送到某个默认代理(我猜?)。
将BROKER_URL
添加到app.conf.update
可以解决问题,尽管我还不完全清楚Celery在内部发生的事情......