我有一个以此命令开始的芹菜工作过程:
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个CPU,所以显然不是那样。从我阅读的所有内容中,它应该只是一个线程,因为我告诉它使用Gevent进行并发。
为什么它使用超过1,什么决定了数字,我该如何控制它?
事实证明,这些线程是由gevent维护的,但它们不用于运行用户代码:
默认情况下,gevent将创建线程以处理DNS分辨率 合作时尚(对呼叫者看不见)。gevent Will 永不运行 在单独的线程中隐式中的用户代码而不明确地 指示通过直接使用线程池
进行操作