我正在做什么的Python多处理过程或池?

时间:2013-08-11 20:08:23

标签: python multithreading asynchronous multiprocessing

我是Python的多处理新手,试图找出是否应该使用Pool或Process来调用两个函数async。我有两个函数进行curl调用并将信息解析为2个单独的列表。根据互联网连接,每个功能可能需要大约4秒。我意识到瓶颈在于ISP连接,多处理不会加速它,但让它们开始异步会很好。另外,对于我来说,进入python的多处理是一个很好的学习经验,因为我将在以后使用它。

我已阅读Python multiprocessing.Pool: when to use apply, apply_async or map?并且它很有用,但仍有我自己的问题。

所以我能做到的一种方法是:

def foo():
    pass

def bar():
    pass

p1 = Process(target=foo, args=())
p2 = Process(target=bar, args=())

p1.start()
p2.start()
p1.join()
p2.join()

我对此实施的问题是: 1)由于连接阻塞直到调用进程完成...这是否意味着p1进程必须在p2进程启动之前完成?我总是理解.join()与pool.apply()和pool.apply_sync()。get()相同,其中父进程在当前运行完成之前无法启动另一个进程(任务)。

另一种选择是:

def foo():
    pass

def bar():
    pass
pool = Pool(processes=2)             
p1 = pool.apply_async(foo)
p1 = pool.apply_async(bar)

我对此实施的问题是: 1)我需要pool.close(),pool.join()吗? 2)在我得到结果之前,pool.map()会使它们全部完整吗?如果是这样,他们还在跑吗? 3)pool.apply_async()与使用pool.apply()执行每个进程有何不同 4)这与以前的Process实现有何不同?

2 个答案:

答案 0 :(得分:28)

您列出的两个场景完成了同样的事情,但方式略有不同。

第一个场景启动两个独立的进程(称为P1和P2)并启动P1运行foo和P2运行bar,然后等待,直到两个进程完成各自的任务。

第二种情况启动两个进程(称为Q1和Q2),首先在Q1或Q2上启动foo,然后在Q1或Q2上启动bar。然后代码等待,直到两个函数调用都返回。

所以净结果实际上是相同的,但在第一种情况下,您可以保证在不同的流程上运行foobar

至于你对并发性的具体问题,.join()上的Process方法确实会阻塞,直到进程完成,但因为你在P1和P2上都调用了.start() (在您的第一个场景中)在加入之前,两个进程将异步运行。然而,解释器将等到P1完成,然后再尝试等待P2完成。

关于游泳池场景的问题,你应该在技术上使用pool.close(),但这取决于你之后可能需要什么(如果它只是超出范围那么你不需要必须关闭它。 pool.map()是一种完全不同的动物,因为它在池进程中将一堆参数分配给同一个函数(异步),然后在返回结果列表之前等待所有函数调用完成。 / p>

答案 1 :(得分:11)

由于您从curl调用中获取数据,因此您受IO限制。在这种情况下,grequests可能会派上用场。这些实际上既不是进程也不是线程,而是协同程序 - 轻量级线程。这将允许您发送异步HTTP请求,然后使用multiprocessing.Pool来加速CPU绑定部分。

  

1)由于连接阻塞直到调用进程完成...这是否意味着p1进程必须在p2进程启动之前完成?

是的,在p2.join()返回后调用p1.join(),表示p1已完成。

  

1)我是否需要pool.close(),pool.join()

您最终可能会遇到孤立的进程,而不会执行close()join()(如果进程无限期地服务)

  

2)在我得到结果之前,pool.map()会让它们全部完成吗?如果是这样的话,他们还在跑吗?

它们以异步方式运行,但map()被阻止,直到完成所有任务。

  

3)pool.apply_async()与使用pool.apply()执行每个进程有何不同

pool.apply()正在阻止,所以基本上你会同步进行处理。

  

4)这与先前使用Process

的实现有何不同

在您申请foo之前,工作人员可能已bar完成工作,因此您最终可能会让一名工作人员完成所有工作。此外,如果您的某个工作人员死亡Pool会自动生成一个新工作人员(您需要重新申请该任务)。

总结:我宁愿选择Pool - 它非常适合生产者 - 消费者案例,并负责所有任务分配逻辑。