python2.7多进程池异步vs同步

时间:2013-11-08 04:03:34

标签: python multiprocessing

很多doc写道:'apply'用于同步,而'apply_async'用于异步。 我读了多处理的源代码(在文件multiprocessing / pool.py中),它说:

def apply(self, func, args=(), kwds={}):
    assert self._state == RUN
    return self.apply_async(func, args, kwds).get()

...
def apply_async(self, func, args=(), kwds={}, callback=None):
    assert self._state = RUN
    ....
    return result

似乎只应用apply_async,唯一的区别就是它们的返回值。

所以我的问题是:

同步和异步之间的真正区别是什么?为什么?

2 个答案:

答案 0 :(得分:1)

巨大的差异是.get()在结尾处:

    return self.apply_async(func, args, kwds).get()

apply_async()本身不会阻止调用者:对apply_async()的调用立即返回,并返回一个AsyncResult对象。这些对象(以及其他)具有.get()方法,阻止,直到被调用的进程完成运行func(*args, **kwds)并返回其结果。

由于apply()阻塞直到结果准备就绪,如果您使用apply(),则无法让多个客户端进程同时工作。有时这是你想要的,但通常不是。使用apply_async()代替您可以并行启动任意数量的任务,并在以后检索其结果。

答案 1 :(得分:1)

区别在于get()功能。执行被阻止,直到apply呼叫完成。 apply_async会立即返回ApplyResult对象,您必须在该对象上调用get()才能获得返回值。此外,异步版本的调用支持一个回调,该回调将在执行完成时执行,允许事件驱动的操作。

如果您向apply_async提供多项功能,则无法保证其退货订单与提交订单相同。您应该检查map()函数以获得结果。