3

我不太了解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_acall_3_times所以花费的时间少于 9 分钟,可能是 3 分 10 秒(只是一个例子,它可能会比这更快)。

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

4

2 回答 2

5

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

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

  1. 在工人场(多台服务器)上分配作业
  2. 在每个工作函数中添加并发性,以便每个工作人员产生新的线程或进程来完成实际工作。

选择 #2 取决于您正在进行的工作类型(I/O 或 CPU 限制)。如果它是 IO 绑定和线程安全的,则在工作函数中使用线程,否则,使用多处理并权衡增加的资源依赖性。但是,如果您有资源来生成多个进程,为什么不首先增加复杂性较低的工作人员数量。

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

于 2017-11-10T00:41:31.360 回答
2

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

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

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


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

然后您可以执行以下操作:

celery worker --concurrency=10

它提供工人级别的并发性,因此您不需要创建 20000 个工人或其他东西。

于 2017-04-28T05:44:19.250 回答