什么控制芹菜工人线程?

时间:2019-03-14 18:26:50

标签: multithreading celery python-multithreading gevent

我有一个用以下命令启动的Celery worker进程:

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

我有一些对gevent并发安全的任务,但对OS线程却不安全,并且我看到一个间歇性错误,表明它们由多个OS线程运行。

查看工作进程,它似乎总共有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个线程。我不知道该控制什么。我在芹菜文档中看不到有任何说明。

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

为什么它使用大于1的数字,什么决定了数字,如何控制它?

1 个答案:

答案 0 :(得分:0)

事实证明,这些线程是由gevent维护的,但documentation

  

默认情况下,gevent将创建线程以处理DNS中的DNS解析   合作方式(对呼叫者不可见)。 gevent将从不运行   隐式地将用户代码隐藏在单独的线程中,而无需显式地   通过直接使用线程池来指示这样做