3

大量的文档写入:'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 只是调用了 apply_async,唯一的区别是它们的返回值。

所以我的问题是:

sync 和 async 之间的真正区别是什么?为什么?

4

2 回答 2

2

巨大的区别是.get()在末尾:

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

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

由于apply()在结果准备好之前一直阻塞,因此如果您只使用一个,则不可能让多个客户端进程同时工作apply()。有时这就是你想要的,但通常不是。相反apply_async(),您可以并行启动任意数量的任务,并在以后检索它们的结果。

于 2013-11-08T04:27:27.870 回答
1

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

如果您向 提供多个函数apply_async,则不保证它们的退货顺序与提交顺序相同。您应该检查该map()功能以按顺序获得结果。

于 2013-11-08T04:28:33.527 回答