【发布时间】:2013-08-13 03:01:56
【问题描述】:
我是 Python 中多处理的新手,并试图弄清楚是否应该使用 Pool 或 Process 来异步调用两个函数。我有两个函数进行 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 实现有何不同?
【问题讨论】:
标签: python multithreading asynchronous multiprocessing