根据我的阅读,回调是非阻塞的。即使封闭功能尚未完成,作为回调传递的函数也会开始执行。但我错过了一些东西。在这个例子中:
def func1(x, callback):
print(x)
for _ in range(100000000):
continue
print("done counting to hundred million")
callback()
def func2():
for _ in range(10000000):
continue
print("counted to 10 million")
func1("starting to count to hundred million",func2)
func1计数到一亿(模拟滞后的网络套接字或其他进程)。我认为func2会在func1完成之前执行,但事实并非如此。显然我误解了回调的异步性质。它们是异步的吗?我怎么会错过这个?
答案 0 :(得分:1)
不,默认情况下,回调不是异步的。许多异步API 使用回调,但回调本质上并不意味着异步行为。在您的示例中,您只是将func2
函数对象传递给func1
,就像您将任何其他类型的对象一样,然后在迭代{{1}之后实际上以同步方式调用它对象,与调用普通函数的方式相同。将函数对象作为参数传递给range
的事实没有特别的意义。
您可能正在考虑将回调作为参数的异步API,例如multiprocessing.Pool.apply_async
。在这种情况下,func1
旨在在工作进程中运行函数,然后在工作进程完成时在主进程中的后台线程中异步执行multiprocessing.Pool
。这是使用内置于callback
的逻辑完成的,但它不仅仅是神奇地发生,因为该函数采用了一个名为multiprocessing.Pool
的参数。