首先,有三种函数:
起始函数:大致可以等同于主函数
中间函数:中间函数把回调函数作为参数传递执行
回调函数:一个有独立功能的函数
怎么理解:
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。
在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做 触发回调事件,店员给你打电话叫做 调用回调函数,你到店里去取货叫做 响应回调事件。
# 回调函数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 threadingdef wr(text): with open(r'c:adshwq.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()