很多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,唯一的区别就是它们的返回值。
所以我的问题是:
同步和异步之间的真正区别是什么?为什么?
答案 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()
函数以获得结果。