python回调仍在阻塞

时间:2014-10-22 01:52:02

标签: python callback

根据我的阅读,回调是非阻塞的。即使封闭功能尚未完成,作为回调传递的函数也会开始执行。但我错过了一些东西。在这个例子中:

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完成之前执行,但事实并非如此。显然我误解了回调的异步性质。它们是异步的吗?我怎么会错过这个?

1 个答案:

答案 0 :(得分:1)

不,默认情况下,回调不是异步的。许多异步API 使用回调,但回调本质上并不意味着异步行为。在您的示例中,您只是将func2函数对象传递给func1,就像您将任何其他类型的对象一样,然后在迭代{{1}之后实际上以同步方式调用它对象,与调用普通函数的方式相同。将函数对象作为参数传递给range的事实没有特别的意义。

您可能正在考虑将回调作为参数的异步API,例如multiprocessing.Pool.apply_async。在这种情况下,func1旨在在工作进程中运行函数,然后在工作进程完成时在主进程中的后台线程中异步执行multiprocessing.Pool。这是使用内置于callback的逻辑完成的,但它不仅仅是神奇地发生,因为该函数采用了一个名为multiprocessing.Pool的参数。