立即學習:https://edu.csdn.net/course/play/24458/296452?utm_source=blogtoedu
1.知識點:(詳細見代碼注釋)
1)同步調用:
res1 = pool.submit(ju,'john1').result()
2)異步調用
pool.submit(ju,'john1')
3)二者區別
異步調用:只是提交了任務即可,不會在原地等待結果,馬上運行下面的代碼
同步調用:提交完任務后,在原地等待結果,等到結果后再執行后面的代碼,代碼運行的效果呈串行
4)異步回調機制
#回調機制:異步調用不會等待結果,但是也可獲得結果,這里通過回調機制,來獲得一個concurrent.futures對象,需要通過.result()來獲得數據
5)同步與阻塞的區別
同步調用不管是I/O還是計算密集型都需要等待,而阻塞只有在I/O情況下才會發生
2.同步調用:同步調用不管是I/O還是計算密集型都需要等待,而阻塞只有在I/O情況下才會發生
#同步與異步調用都是提交任務的一種方式,以舉重最例#同步調用:提交完任務后,在原地等待結果,等到結果后再執行后面的代碼,代碼運行的效果呈串行
from concurrent.futures import ProcessPoolExecutor
import time,random#創建函數模擬舉重的任務
def ju(name):print('%s is juing'%name)#舉重的時間time.sleep(random.randint(2,3))#舉重的重量res = random.randint(4,8)return {'name':name,'res':res}#創建函數模擬提交舉重結果的事件
def weight(response):name = response['name']size = response['res']print('%s 舉重的重量是《%s》kg'%(name,size))if __name__ == '__main__':#創建進程池pool = ProcessPoolExecutor(5)#提交任務,此處使用同步調用result(),得到函數返回的結果res1 = pool.submit(ju,'john1').result()weight(res1)res2 = pool.submit(ju,'john2').result()weight(res2)res3 = pool.submit(ju,'john3').result()weight(res3)
同步調用結果
X:\Users\13711\AppData\Local\Programs\Python\Python37\python.exe C:/Users/jinlin/Desktop/python_further_study/并發編程/異步調用與回調機制.py
john1 is juing
john1 舉重的重量是《7》kg
john2 is juing
john2 舉重的重量是《8》kg
john3 is juing
john3 舉重的重量是《7》kg進程已結束,退出代碼0
2.異步調用
#異步調用:只是提交了任務即可,不會在原地等待結果,馬上運行下面的代碼
#回調機制:異步調用不會等待結果,但是也可獲得結果,這里通過回調機制,來獲得一個concurrent.futures對象,需要通過.result()來獲得數據
from concurrent.futures import ProcessPoolExecutor
import time,random#創建函數模擬舉重的任務
def ju(name):print('%s is juing'%name)#舉重的時間time.sleep(random.randint(2,3))#舉重的重量res = random.randint(4,8)return {'name':name,'res':res}#創建函數模擬提交舉重結果的事件
def weight(response):response = response.result()name = response['name']size = response['res']print('%s 舉重的重量是《%s》kg'%(name,size))if __name__ == '__main__':#創建進程池pool = ProcessPoolExecutor(5)#提交任務,此處使用異步調用,不得到函數返回的結果,使用回調函數add_done_callback(回調函數)來得到一個對象pool.submit(ju,'john1').add_done_callback(weight)pool.submit(ju,'john2').add_done_callback(weight)pool.submit(ju,'john3').add_done_callback(weight)
異步調用的結果
X:\Users\13711\AppData\Local\Programs\Python\Python37\python.exe C:/Users/jinlin/Desktop/python_further_study/并發編程/異步調用與回調機制.py
john1 is juing
john2 is juing
john3 is juing
john1 舉重的重量是《5》kg
john2 舉重的重量是《4》kg
john3 舉重的重量是《5》kg進程已結束,退出代碼0
?