RQ 与 supervisord 并发?

RQ concurrency with supervisord?

全部,我正在尝试 'force' RQ workers 使用 supervisord 并发执行。我的设置 supervisord 设置似乎工作正常,因为 rq-dashboard 显示 3 个工作人员、3 个 PID 和 3 个队列(每个 worker/PID 一个)。 Supervisord设置如下(仅显示worker 1设置,下面定义了另外2个worker):

[program:rqworker1]
command = rqworker 1 
process_name = rqworker1-%(process_num)s
numprocs = 1 
user = username 
autostart = True
stdout_logfile=/tmp/rqworker1.log
stdout_logfile_maxbytes=50MB

问题是当我同时发送 3 个作业时,运行 的总时间是单个任务的 x3(即,总时间与任务数量成线性关系,这会扩展到 x4、x5、 ETC..)。似乎没有并发可用。我还通过将新作业发送到具有最少启动+排队作业的队列来实现原始负载平衡,效果很好(观察到作业在队列中均匀分布)。

为什么这个设置不允许并发?

关于我遗漏的设置有什么注意事项吗?

请注意,rq-gevent-worker 包(在 w.r.t.concurrency/RQ 之前工作得很好)在我迁移到 PY3 时不再可用,并且 PY3 尚不支持 gevent 本身。但这给了我一个线索,即并发是可能的。

Modifying my comment from above into an answer...

并行使用supervisord到运行多个rqworker进程是python-rq中的intended pattern,所以不用担心你"forcing"它。其实你的想法是对的。

另一方面,编写您自己的负载平衡算法是一项 anti-pattern:这正是 python-rq 为您所做的。

如果你想在三个工人之间分担工作,那么他们应该都听同一个队列。尝试删除两个主管配置块,并在剩下的一个块中,将 numprocs 更改为 3。如果您向该队列快速提交三个作业,您应该会看到三个工作人员同时执行。