【问题标题】:Python Django Celery, terminating running task not workingPython Django Celery,终止正在运行的任务不起作用
【发布时间】:2020-04-22 00:59:51
【问题描述】:

我创建了一个网络应用程序,用户可以在其中运行多个脚本(芹菜任务)。

我浏览了this artcle,发现我必须使用--pool (prefork, eventlet or gevent) 而不是solo,因为一次可以运行更多脚本。

如果用户需要,我需要能够终止正在运行的任务,因此我只需要使用 prefork 。我发现eventlet and gevent没有实现revoke方法。

现在的问题。 当我用 eventlet or gevent 运行 --pool 时,任务被接收并执行。但我不能像所说的那样终止它。 当我运行 --poolprefork 时,它应该能够终止任务,但是当我运行任务时,它只被接收但甚至不被执行。

最后一个认为我不明白。我试图从--pole=solo 开始只是为了尝试撤销任务(但我以后不能使用它,因为我需要一次运行更多脚本)。 而这里的 revoke 方法什么也不做。

app.control.revoke(task_id, terminate=True)

所以我的问题是我应该使用什么,以便能够终止任务并能够一次运行更多任务。

Krukas 更新:

当我运行 celery 时 celery -A TNS worker --loglevel=INFO --without-gossip --without-mingle --without-heartbeat -Ofair --pool=gevent --concurrency=2

然后在应用中运行脚本 celery 显示

[2020-01-04 18:13:33,213: INFO/MainProcess] Received task: api.tasks.task_1[d4e37b3b-67a7-49b9-879f-5157bcc28585]
[2020-01-04 18:13:43,418: INFO/MainProcess] Task api.tasks.task_1[d4e37b3b-67a7-49b9-879f-5157bcc28585] succeeded in 10.202999999999975s: None 

所以任务被执行了,当我通过celery -A TNS worker -l info --without-gossip --without-mingle --without-heartbeat -Ofair --pool=prefork --concurrency=2运行Celery时

日志显示

[2020-01-04 18:21:39,255: INFO/MainProcess] Received task: api.tasks.task_1[4071904e-e014-4075-828e-58a0a87c781f]
[2020-01-04 18:21:40,696: INFO/SpawnPoolWorker-4] child process 9708 calling self.run()
[2020-01-04 18:21:40,696: INFO/SpawnPoolWorker-3] child process 8428 calling self.run()

脚本被执行。

【问题讨论】:

    标签: python django celery


    【解决方案1】:

    查看此文档以撤销 https://docs.celeryproject.org/en/latest/userguide/workers.html#worker-persistent-revokes

    有两件重要的事情:

    1. revoke 仅适用于 RabbitMQ 或 Redis 代理。
    2. 如果您没有启用 statementb 并且您的工作人员重新启动,它将丢失撤销信息。

    【讨论】:

    • 感谢克鲁卡斯的回复。我使用 RabbitMQ 作为代理。我也使用CELERYD_STATE_DB = "celery_state.db" 设置。
    • 再次阅读了你的问题,我想你回答了你自己的问题,如果你想使用撤销,你需要使用 prefork。 but when i run the task it is only received but not even executed 这是调用 revoke 的时候吗,因为 revoke 就是这样做的。我不知道你想要多少并发,但是只要这些任务不是 CPU 密集型的,使用具有更多并发的 prefork 就可以了,然后 CPU 内核就可以了。由于 Python 多处理的工作方式,它可能会比 gevent/evenlet 消耗更多的 RAM。工作设置有 6 个内核,并发 22 个,但我们没有 CPU 密集型任务。
    • 任务不是 CPU 密集型的,因此我必须按照您的同意使用 prefork。但是prefork的问题是Celery接收到了任务,但是Celery不执行它们。因此,我什至无法尝试撤销它们。
    • 只更改了池,然后它不起作用。 Whit 收到你的意思是你在 Celery 控制台中看到了任务吗?当对我来说任务没有运行时,要么是代理不同(这是因为我们的设置设置方式),要么是找不到任务,在 Celery 启动时,您应该看到 Celery 找到的任务列表。
    • 我已经编辑了我的帖子以获取更多详细信息,因此它的排列更加合理。
    猜你喜欢
    • 2011-04-04
    • 2018-09-17
    • 2012-02-20
    • 1970-01-01
    • 2012-12-20
    • 2017-03-19
    • 1970-01-01
    • 2019-06-25
    • 2017-06-15
    相关资源
    最近更新 更多