我在任务生产者多于消费者(工作者)的情况下创建一个芹菜任务。现在,由于我的队列被填满了,并且工人以FCFS方式消费,我可以立即执行特定的任务(给定task_id
)吗?
:
我的任务按以下方式填写。[1,2,3,4,5,6,7,8,9,0]
。现在从第0个索引中获取任务。现在出现一种情况,我首先想执行任务8。我该怎么做呢?
worker不需要执行该任务(因为可能存在一个worker已经被占用的情况)。它可以直接从应用程序中运行。当任务完成时(从worker或直接从应用程序),它应该从队列中删除。
我知道如何强制撤销任务(给定task_id
),但我如何执行给定id的任务?
如何执行给定id的任务?
简短的回答是你不能。当任务可用时,Celery worker从代理后端提取任务。
为什么不呢?
请注意,这不是芹菜本身的限制,而是消息队列系统(MQS)的一般特征。MQS的重点是使应用程序的组件不同步,以便生产者可以在工作者异步执行任务时继续执行其他工作。换句话说,一旦任务被发送出去,它就不能被修改(但是只要它还没有启动,它就可以被删除)。
有哪些选项?
芹菜为您提供了几个选项来处理低优先级或高优先级或短期和长期运行的任务,在任务提交时:
-
路由-任务可以路由到不同的worker。所以如果你的任务[0 ..]9]都是长时间运行的,除了任务8,您可以将任务8路由到一个或一组处理短时间运行任务的工作者。
-
定时执行-为每个任务指定倒计时或估计到达时间(eta)。如果你知道有些任务可以延迟到以后执行,也就是说,当系统不那么忙的时候,这是一个很好的选择。这使得工人为那些需要立即执行的任务做好了准备。
-
任务过期-指定一个过期倒计时或回调时间。这样,如果任务没有在分配给它的时间内执行,那么任务将被撤销,并且回调可以启动另一个操作过程。
-
定期检查任务结果,如果任务在一段时间内没有开始执行,则撤销任务。注意,这与任务到期不同,在任务到期时,只在工作人员从队列中获取任务时才会撤销——如果队列已满,则对您的用例来说,撤销可能发生得太晚了。定期检查结果意味着您的系统中有另一个组件执行此操作并确定替代操作过程。