1. 程式人生 > >非同步回撥

非同步回撥

為什麼要非同步回撥?

 子程序幫助主程序完成任務

處理任務的結果應該交還主程序

其他方式也可以將資料交還給程序

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)

回撥函式在程序池與執行緒池的區別。

回撥函式是在程序池中就交由主程序執行,而線上程池中則是交由執行緒池中空閒函式執行