"""call_back
回调函数就是(我给你电话,你忙完你的,按照号码打回来)
obj.add_done_callback(func)
对象.打电话给我(留的联系方式)
回调函数:
把函数当成参数传递给另外一个函数
在当前函数执行完毕之后,调用一下传递进来的函数,该函数是回调函数
"""
from concurrent.futures import ThreadPoolExecutor
from threading import currentThread as cthread
import time,os
# (1) 线程池,它的回调函数 由子线程完成
"""
(1)add_done_callback 在获取当前线程的返回值的时候,可以异步并发,加快速度
(2)回调函数由谁执行:由执行任务的当前子线程,调用回调函数
"""
lst = []
def func(i):
print("thread",i,cthread().ident)
time.sleep(0.1)
print("thread %s end" % (i))
return "*" * i
# 回调函数
def call_back(obj):
print("<==start==>")
print("call_back:",cthread().ident)
print(obj)
print(obj.result())
print("<==end==>")
tp = ThreadPoolExecutor(5)
for i in range(1,11):
obj = tp.submit(func,i)
# 使用回调函数,异步并发
obj.add_done_callback(call_back)
# print(obj)
# lst.append(obj)
# 打印返回值
for i in lst:
print(i.result())
# print("主线程执行结束.. end",cthread().ident)
# 代码解析:
class MyClass():
def add_done_callback(self,func):
# code1 code2 code3....
"""
self <==> obj
func <==> call_back
"""
# 最后func
func(self)
def call_back(args):
# args <==> obj
print("call_back:",cthread().ident)
print(args)
print(args.result())
obj = MyClass()
obj.add_done_callback(call_back)
# (2) 进程池,它的回调函数 由主进程完成
"""
(1)add_done_callback 在获取当前进程的返回值的时候,可以异步并发,加快速度
(2)回调函数由谁执行:都由主进程来完成
"""
from concurrent.futures import ProcessPoolExecutor
def func(i):
print("Process",i,os.getpid())
time.sleep(0.1)
print("Process %s end" % (i))
return "*" * i
def call_back(obj):
print("call_back:",os.getpid())
print(obj.result())
if __name__ == "__main__":
p = ProcessPoolExecutor(5)
for i in range(1,11):
obj = p.submit(func,i)
# print(obj.result())
obj.add_done_callback(call_back)
print("主进程执行结束.." , os.getpid())