我的用例: (芹菜任务A在服务器A上运行,而芹菜任务B在服务器B上运行)
taskA (在服务器A上) - >调用并等待 taskB 完成(在服务器B上) - > taskA on(服务器A)继续执行来自taskB的结果
伪代码:
服务器A上的
@task
def taskA():
remoteTask = current_app.send_task("taskB", exchange="xxx", routing_key="serverB")
result = t.get()
# process result
服务器B上的
@task
def taskB():
# do something
return result
该代码显然违反了Celery官方指南中提到的"Avoid launching synchronous subtasks"规则。我可以从控制台看到死锁警告。
所以,我尝试用签名方法和或运算符
重写子任务样式的代码@task
def taskA()
remoteTask = signature("taskB", exchange="xxx", routing_key="serverB")
followingTask = signature("taskAA", exchange="xxx", routing_key="serverA")
chain = remoteTask | followingTask
return chain()
@task
def taskAA(result)
# process result
死锁警告消失了,但代码似乎不太清楚。
有没有更好的解决方案?或者我错过了什么?