5

总而言之,我正在尝试“强制”RQ 工作人员使用 supervisord 同时执行。我的设置 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

在 supervisord 下运行的 RQ 工作者

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

为什么此设置不允许并发?

关于我缺少的设置的任何注意事项?

请注意,当我迁移到 PY3 并且 PY3 尚不支持 gevent 本身时,rq-gevent-worker 包(在早期的并发/RQ 上运行良好)不再可用。但这给了我一个线索,即并发是可能的。

4

1 回答 1

4

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

使用并行supervisord运行多个rqworker进程是 中的预期模式python-rq所以不要担心你“强迫”它。你实际上有正确的想法。

另一方面,编写自己的负载平衡算法是一种反模式:这正是python-rq对你有用的。

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

于 2016-01-05T17:54:02.243 回答