2015-04-28 36 views
2

所有,我试图'强迫'RQ工作人员使用supervisord同时执行。我的设置supervisord设置似乎工作正常,因为rq-dashboard显示3名工人,3个PID和3个队列(每个工人/ PID一个)。 Supervisord设置如下(只显示工作者1设置,2名工人被定义在这之下):RQ并发与supervisord?

[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等)。似乎没有并发可用。我还通过将最新开始的+排队作业发送到队列的新作业来实现原始负载平衡,这很好地工作(观察到作业在队列之间均匀分布)。

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

关于我失踪的设置的任何注意事项?

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

+0

也许你正在把所有的工作都喂给同一个工人/队列? –

+0

不,我测试过这个;首先,每个工作人员监控一个队列,我所做的工作是将工作平均分配到三个队列(再次测试工作),从那里每个工人应该只处理自己的工作。但这并非同时完成,因为完成时间与作业数量成线性关系。如果并发工作,假设作业在队列/工作者之间均匀分配,则总共需要时间=#Jobs /#Workers。 –

+2

我使用'supervisord'并行运行多个rqworkers。 (顺便说一句,这不是一个“力量”,它是'python-rq'中的[预期模式](http://python-rq.org/patterns/supervisor/)。)另一方面,写作你自己的负载均衡算法是一种反模式:这正是'python-rq'为你所做的。如果你想分工3个工人之间的工作,那么他们都应该听同一个队列。你可以删除你的两个管理员配置块并将'numprocs'改为'3'。否则,没有足够的信息来知道什么是错的:有多少个CPU? IO绑定或CPU绑定的任务是什么? –

回答

1

修改我的评论从上方插入一个答案......

使用supervisord运行多个rqworker过程并行是python-rqintended pattern,所以不要担心,你是“逼“它。你实际上有正确的想法。

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

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