我尝试在芹菜工作进程内运行任务时获取当前线程 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
几乎有可能是同一个工作进程选择几个连续的任务,特别是如果它执行任务的速度比你发送的快。如果您更喜欢更随机的行为,请将-Ofair
优化参数传递给您的工作人员(例如:celery -A my.project.app worker -c 5 -O fair -l info
(
库的线程可能不是获取 Celery 工作线程 ID 的正确方法。这是因为 Celery 使用不同的库进行并发,这取决于您的配置。默认情况下,这些工作线程池由台球(也是 Celery 项目库(管理,获取进程信息的正确方法是使用 current_process