python rq worker并行执行任务

时间:2017-04-28 02:36:52

标签: python message-queue python-rq

我不太了解python rq,我刚开始学习它。

有一个task_a需要3分钟才能完成处理。

@job
def task_a():
    time.sleep(180)
    print('done processing task_a')

def call_3_times():
    task_a.delay()
    task_a.delay()
    task_a.delay()

根据我的观察,task_a将从队列中逐个执行。第一次通话结束后,进入下一个通话,依此类推。总时间为3分钟x 3 = 9分钟

如何使task_a函数中的每个call_3_times并行执行?所以花费的时间少于9分钟,可能是3分10秒(只是一个例子,它可能比这更快)。

可能我需要产生3个rq工作者是的它确实更快并且像并行一样。但是如果我需要调用它2000次呢?我应该产生2000 rq的工人吗?我的意思是,必须有更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:1)

如果需要将任务调用2000次,则可以在队列中创建2000个作业,并且一次只能有3个工作并行3个,直到完成所有作业。

工作人员数量取决于服务器的规格。启动2000名工人试图同时并行所有工作显然是不切实际的。如果你真的需要一次处理数千个工作,你有两个选择:

  1. 在工作场(多台服务器)上分配作业
  2. 在每个工作程序函数中添加并发,以便每个工作程序生成新的线程或进程来执行实际工作。
  3. 选择#2取决于您正在做什么类型的工作(I / O或CPU绑定)。如果它是IO绑定和线程安全的,则在worker函数中使用线程,否则,使用多处理与增加资源依赖性的权衡。但是,如果您有资源产生多个进程,为什么不在第一个位置增加工作量,而复杂性较低。

    总而言之,基于您的任务类型。如果是I / O绑定,则可以执行#1 /#2。如果它受CPU限制,则您的选择仅限于服务器规范的#1。

答案 1 :(得分:0)

如果你使用rq,答案是肯定的,你需要跨越更多的工作人员来执行并发。

这是来自rq网站: http://python-rq.org/docs/workers/

每个工作人员一次只能处理一项工作。在工作者中,没有并发处理。如果您想同时执行工作,只需启动更多工作人员。

如果想找到解决方案,请尝试芹菜:http://docs.celeryproject.org

然后你可以做类似的事情:

celery worker --concurrency=10

它提供了工作级并发,因此您不需要spwn 20000 worker或其他东西。

相关问题