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