【问题标题】:Getting same thread id inside celery workers在 celery worker 中获取相同的线程 id
【发布时间】:2019-11-23 12:34:00
【问题描述】:

我尝试在 celery 工作进程中运行任务时获取当前线程 ID 和进程 ID。 我已将预取乘数设置为 1,并且我有 4 个 cpu 核心机器,因此每个工作人员将运行 4 个工作进程。 我只有 1 个工作人员在运行(4 个工作进程)。

据我了解,每个工作进程实际上都在处理任务的执行。当我同时运行 4 个任务时,我尝试分别使用 os.getpid() 和 threading.get_ident() 在任务中获取进程 ID 和线程 ID。

毫不奇怪,对于每个运行的任务,我得到相同的一组 4 个 process_id(因为有 4 个工作进程正在运行),但每个进程的线程 id 是相同的。我无法理解这怎么可能。

以下是我在运行任务时的观察:

>     log: pid id: 513, t_id 140373758563328
>     log: pid id: 514, t_id 140373758563328
>     log: pid id: 513, t_id 140373758563328
>     log: pid id: 513, t_id 140373758563328
>     log: pid id: 513, t_id 140373758563328
>     log: pid id: 513, t_id 140373758563328
>     log: pid id: 578, t_id 140280371217408
>     log: pid id: 579, t_id 140280371217408

【问题讨论】:

  • 你是如何运行 celery 的? Prefork/gevent?
  • @IainShelvington 我正在运行 prefork 池
  • 粘贴你正在运行的 celery 命令?
  • @sp1rs celery -A project.celery worker -l DEBUG

标签: django multithreading celery celery-task


【解决方案1】:

同一个工作进程很可能会选择几个连续的任务,特别是如果它执行任务的速度比您发送的速度快。如果您喜欢更随机的行为,请将 -Ofair 优化参数传递给您的工作人员(例如:celery -A my.project.app worker -c 5 -O fair -l info

【讨论】:

  • 我很确定情况并非如此,因为每次运行任务时我都会获得不同的进程 ID(我获得的这些进程 ID 始终是 4 个进程 ID 的子集,如有 4 个工作进程正在运行)。但是线程 id 总是相同的,我也尝试了 -0 fair 选项,但我仍然得到相同的线程 id。
  • 你的并发类型是什么?前叉?小事件?事件?线程?
  • 这是默认的 - prefork。我使用以下命令启动了我的工人: celery -A project.celery worker -l DEBUG
【解决方案2】:

Threading 库中的线程可能不是获取 Celery 工作线程 ID 的正确方法。那是因为 Celery 使用不同的库来实现并发,这取决于你的配置。默认情况下,这些工作人员池由 billiard(也是一个 Celery 项目库)管理,获取进程信息的正确方法是使用 current_process

【讨论】:

    猜你喜欢
    • 2017-04-02
    • 1970-01-01
    • 2016-09-20
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-23
    • 1970-01-01
    相关资源
    最近更新 更多