正如Celery 文档所述.revoke(),除非terminate=True已设置,否则不会通过调用中止已执行的任务.但不建议这样做,因为它会杀死工作人员本身,这可能已经开始了另一项任务.这是否意味着没有可靠,稳定的方法来做到这一点?
编辑:celery.contrib.abortable不适合我,因为,正如文档所述,它只适用于数据库后端.
正在运行的任务是工作线程的正在运行的子进程(使用 prefork 时),这意味着中止任务的唯一方法是杀死正在运行它的子进程。
您可能会尝试尝试自己的撤销事件处理实现,试图找出子进程 ID 并仅终止该子进程,但老实说,您不知道是否值得以及它是否真的可以工作。
我认为简短的回答是你不能。
无论如何,有时需要杀死工作人员,特别是在项目的初始阶段,您仍然需要正确确定资源的大小,只需确保您在某处记录正在运行的任务,以便您可以重新安排它们或仅使用CELERY_ACKS_LATE