非同步回撥
阿新 • • 發佈:2018-11-13
為什麼要非同步回撥?
子程序幫助主程序完成任務
處理任務的結果應該交還主程序
其他方式也可以將資料交還給程序
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)
回撥函式在程序池與執行緒池的區別。
回撥函式是在程序池中就交由主程序執行,而線上程池中則是交由執行緒池中空閒函式執行