我用 celery 做一些 IO 任务,比如抓取远程图片,给用户发邮件。但芹菜有时会因没有原木而阻塞。此时,它不会执行我发送的任何任务。我必须重新启动它,它开始在它阻塞的地方工作。
它让我困惑了很长时间。我能做些什么 ?用 celery 分发 IO 任务的最佳实践是什么?
默认情况下,celery worker fork 多个进程等待来自客户端的任务请求。对于 IO 待处理的任务,您的系统需要大量并发处理请求。这是命令:
celery -A tasks worker --without-heartbeat -P threads --concurrency=10
如果同时收入请求很多,您的并发级别必须设置为高于传入请求突发的大小。系统的性能可能会受到硬件内存大小或操作系统选择 API 的限制。并发量大时可以使用 celery 的 thread/gevent 模型:
celery -A tasks worker --without-heartbeat -P threads --concurrency=1000
或者
celery -A tasks worker --without-heartbeat -P gevent --concurrency=1000
你可以增加芹菜并发
manage.py celeryd --concurrency=3
其中并发 == 处理器数量
运行外壳命令
grep -c 处理器 /proc/cpuinfo
获取您机器上的处理器数量