从django管理面板停止celery任务

nfs0ujit  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(137)

我正在尝试从Django管理面板停止Celery任务。我有一个名为TaskModel的模型,它包含一个task_id,并且我在TaskModelAdmin中创建了一个自定义操作,以在任务执行期间停止任务。
下面是我的TaskModel:

class TaskModel(models.Model):
    task_id = models.CharField(max_length=50, blank=False)
    
    def stop(self):
        try:
            celery.control.revoke(self.task_id, terminate=True, signal='SIGKILL')
            return "Task stopped"
        except Exception as e:
            return "Error"

下面是我的TaskModelAdmin的相关部分:

class TaskModelAdmin(admin.ModelAdmin):
    @admin.action()
    def stop_tasks(modeladmin, request, queryset):
        for task in queryset.all():
            task.stop()

我在Celery文档中读到,我可以使用带有terminate=True标志的revoke方法来停止任务,但它似乎不起作用,任务成功完成。
有谁能帮助我理解为什么这种方法不能像预期的那样工作,并建议一个解决方案来停止Django管理面板中的Celery任务?
谢谢你,谢谢!

6jjcrrmo

6jjcrrmo1#

我不能模拟你的问题,但可以提出两个重要的观点:
1.celery 文档说你应该先用-A标志开始celery 。
celery -A proj worker -l INFO
1.在文档中,每个revoke()方法都从app.control调用,而不是从celery库本身调用。所以你应该改变这一行:

celery.control.revoke(self.task_id, terminate=True, signal='SIGKILL')

到这一行:

from proj.celery import app
app.control.revoke(self.task_id, terminate=True, signal='SIGKILL')

我希望这能解决你的问题。

相关问题