celery链式分发任务:
task1.si(**kwargs)|task2.si(**kwargs)|last.si(**kwargs)
即按task1, task2, last的顺序分发任务
当执行为单个任务时,任务会很顺畅执行。
但时,当程序分布式高并发执行时,会发生任务虽然都丢进了队列中,但是执行优先级无法控制。
比如上一个任务的last丢进队列后,后面的新开始的task任务也被丢进同一队列,而程序无法优先执行last任务,导致前一个并发任务永远阻塞在last任务,无法结束。
对于需求高相应度的系统,这种方法显然是行不通的。
对于此类情况,我们可以给出两种解决方案:
1.直接将task1 task2 last绑定为同步任务,再丢进队列中:
由于task可以将last任务挤到后面,显然任务并发负载已达到上限,当任务链不多时(比如此时的3个任务组成任务链),可以应用这种办法,而不会损耗太多的资源。
2.将平行的task1,task2丢到一个主队列,将last丢进另外的队列,互不干扰。