我有一个用以下命令启动的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的数字,什么决定了数字,如何控制它?
答案 0 :(得分:0)
事实证明,这些线程是由gevent维护的,但documentation:
默认情况下,gevent将创建线程以处理DNS中的DNS解析 合作方式(对呼叫者不可见)。 gevent将从不运行 隐式地将用户代码隐藏在单独的线程中,而无需显式地 通过直接使用线程池来指示这样做