回调函数故名思义,是指用主函数调用库函数时,将回调函数传进去,让库函数完成本身的功能后继续执行主函数安排的任务。
按照同步与异步可以分为同步回调和异步回调,在此只写明一种基于python的多进程multiprocessing库实现异步回调函数的方法。
import time
from multiprocessing import Process,Pool
# call1,call2,call3分别为3个主函数
def call1(n):
time.sleep(n)
print("call:", 1)
return 1
def call2(n):
time.sleep(n)
print("call:", 2)
return 2
def call3(n):
time.sleep(n)
print("call:", 3)
return 3
def fun(n):
# 回调函数,表示执行完主函数后要完成的工作
print("i'm done!, n={}".format(n))
if __name__ == "__main__":
print('start')
p = Pool(3) # 建立进程池
# 分别用异步的方式执行主函数call,主函数参数n,以及回调函数fun
p.apply_async(func=call1, args=(1, ), callback=fun)
p.apply_async(func=call2, args=(1, ), callback=fun)
p.apply_async(func=call3, args=(1, ), callback=fun)
p.close()
p.join()
print('end')
第一次执行结果为
sky@skyMac test % /usr/bin/python3 /Users/sky/pythonProj/test/callback.py
start
call: 1
i'm done!, n=1
call: 2
i'm done!, n=2
call: 3
i'm done!, n=3
end
第二次执行的结果为:
sky@skyMac test % /usr/bin/python3 /Users/sky/pythonProj/test/callback.py
start
call: 2
call: 1
i'm done!, n=2
call: 3
i'm done!, n=1
i'm done!, n=3
end
可见,三个进程异步执行,并没有严格的按照先后顺序来,但回调函数都是在主函数执行结束后才执行,说明了回调是成功的。