为什么要异步回调?
子进程帮助主进程完成任务
处理任务的结果应该交还主进程
其他方式也可以将数据交还给进程
1.shutdown 主进程会等待所有任务完成
2.result函数 会阻塞直到任务完成
特点:都会阻塞,导致效率降低,所有使用回调
shutdown
from concurrent.futures import ProcessPoolExecutor #shutdown def task(): print("这是task1的执行结果") if __name__ == '__main__': p = ProcessPoolExecutor() for i in range(5): p.submit(task) p.shutdown()#相当进程池为全体加上join print("aaaa")
result
def task(): print("这是task1的执行结果") return "task1" if __name__ == '__main__': p = ProcessPoolExecutor() for i in range(5): f=p.submit(task) print(f.result())#result效果,等待进程执行完成,才能得到返回值 # p.shutdown()#相当进程池为全体加上join print("aaaa") “”“ 这是task1的执行结果 task1 这是task1的执行结果 task1 这是task1的执行结果 task1 这是task1的执行结果 task1 这是task1的执行结果 task1 aaaa ”“”
那么使用异步回调即可达到
from concurrent.futures import ProcessPoolExecutor import time import os def task(): print("生产者正在工作") time.sleep(0.1) return os.getpid() #处理者 def task1(data): """ :param data: :return: """ print("处理者正在工作") print(data.result()) if __name__ == '__main__': for i in range(10): p = ProcessPoolExecutor() f= p.submit(task) f.add_done_callback(task1)
from concurrent.futures import ThreadPoolExecutor from threading import current_thread import time import os def task(): print("生产者正在工作 %s"%current_thread()) time.sleep(0.1) return os.getpid() #处理者 def task1(data): """ :param data: :return: """ print(current_thread()) print("处理者正在工作") print(data.result()) if __name__ == '__main__': for i in range(10): p = ThreadPoolExecutor() f= p.submit(task) f.add_done_callback(task1)
回调函数在进程池与线程池的区别。
回调函数是在进程池中就交由主进程执行,而在线程池中则是交由线程池中空闲函数执行