什么控制芹菜工人线程?

问题描述 投票:0回答:1

我有一个使用此命令启动的Celery工作进程:

celery multi start worker --app=xyz.celery --queue="xyz"
--pidfile="/var/run/xyz/%n.pid"
--pool=gevent --concurrency=500 --time-limit=1800

我有一些安全的gevent并发任务,但不适用于操作系统线程,我看到一个间歇性的错误,表明它们是由多个操作系统线程运行的。

查看工作进程,它似乎总共有7个线程:

$ ps -ef | grep "celery worker"
nobody   26577     1  0 Mar06 ?        00:46:43 /usr/bin/python -m celery worker
--time-limit=1800 --concurrency=500 --pool=gevent --app=xyz.celery
--queue=xyz --pidfile=/var/run/xyz/xyz-worker.service.pid --hostname=worker@xyz

$ cat /proc/26577/status
Name:   python
...
...
Threads:    7
...

(我也可以通过ps -T或htop看到工作者有这7个线程)

在我有类似设置的其他服务器上,我有4个线程而不是7个。我无法弄清楚是什么控制它。我没有在Celery文档中看到任何解释它的内容。

我的所有服务器都有4个cpu,所以显然不是这样。从我读过的所有内容来看,它应该只是一个线程,因为我告诉它使用gevent进行并发。

为什么它使用超过1,什么决定了数字,我该如何控制它?

multithreading celery python-multithreading gevent
1个回答
0
投票

事实证明,这些线程由gevent维护,但they're not used to run user code

默认情况下,gevent将创建线程以协作方式处理DNS解析(对调用者不可见)。如果没有通过直接使用线程池明确指示这样做,gevent将永远不会隐式地在单独的线程中运行用户代码

© www.soinside.com 2019 - 2024. All rights reserved.