在芹菜工人中获取相同的线程ID

时间:2019-07-14 16:06:15

标签: django multithreading celery celery-task

我在celery worker进程中运行任务时尝试获取当前线程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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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