首先,有三种函数:
起始函数:大致可以等同于主函数
中间函数:中间函数把回调函数作为参数传递执行
回调函数:一个有独立功能的函数
怎么理解:
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。
在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做 触发回调事件,店员给你打电话叫做 调用回调函数,你到店里去取货叫做 响应回调事件。
# 回调函数
def double(x):
return x*2
# 中间函数
def get_oddnum(k, fun):
return 1+fun(k)
# 起始函数
def main():
x = 3
# 通过自定义回调函数
result = get_oddnum(x, double)
# 通过匿名函数执行回调
result2 = get_oddnum(x, lambda a:a*8)
在C++中呢也是类似,中间函数有一个参数是函数指针
回调的分类:
阻塞式回调(同步回调):上面的例子就是阻塞式回调,也就是说回调函数的调用发生在起始函数返回之前,也就是说result被赋值之前就被调用
延迟式回调(异步回调):延迟式回调需要多线程或者多进程才能实现,比如上面代码中get_oddnum函数换成是一个要实现将数据写入数据库的函数,返回值为写入结果,那么我们就需要进行取舍,让程序继续执行其他线程,当回调函数执行完成后在发出信号表示自己执行完了然后返回
import threading
def wr(text):
with open(r'c:\ads\hwq.txt','w+') as f:
f.write(text)
def get_wr_status(text):
return wr(text)
def main():
txt1 = "一个大文件"
txt2 = "另一个大文件"
t1 = threading.Thread(target=get_wr_status, args=(txt1, ))
t2 = threading.Thread(target=get_wr_status, args=(txt2, ))
t1.start()
t2.start()
t1.join()
t2.join()