与supervisord的RQ并发?

时间:2015-04-28 19:25:26

标签: python concurrency supervisord python-rq

所有,我试图强迫' RQ工作人员使用supervisord同时执行。我的设置监督设置似乎工作正常,因为rq-dashboard显示3个工作人员,3个PID和3个队列(每个工作人员/ PID一个)。 Supervisord设置如下(仅显示工人1设置,在此下面定义了2个工作人员):

[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

RQ workers running under supervisord

问题是当我同时发送3个作业时,运行的总时间是单个任务的x3(即总时间与任务数量成线性关系,这可以扩展到x4,x5等)。似乎没有可用的并发性。我还通过使用最小的开始+排队作业将新作业发送到队列来实现原始负载平衡,这可以正常工作(观察到作业在队列中均匀分布)。

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

有关设置的任何注意事项我都没有?

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

1 个答案:

答案 0 :(得分:2)

  

将我的评论从上面修改为答案......

使用supervisord并行运行多个rqworker进程的python-rq python-rq,所以请不要担心您是' 34;迫使"它。你实际上有正确的想法。

另一方面,编写自己的负载均衡算法是一种反模式:这正是numprocs为您所做的。

如果你想在三个工人之间分配工作,那么他们都应该听同一个队列。尝试删除两个超级用户配置块,并在剩下的一个块中,将3更改为public boolean contains(E value) { Node current = root; while (current != null) { int comparison = value.compareTo(current.value); if (comparison == 0) { return true; } else if (comparison < 0) { current = current.left; } else { //comparison > 0 current = current.right; } } return false; } 。如果快速向该队列提交三个作业,则应该看到三个工作程序同时执行。