python的學習之旅---回調機制
阿新 • • 發佈:2017-11-25
pen name con urn time start aid 執行 color
回調機制
import requests
需要 requests 模塊的支持
需要回調函數的場景:進程池中任何一個任務一旦處理完了,就立即告知主進程:我好了額,你可以處理我的結果了。主進程則調用一個函數去處理該結果,該函數即回調函數
我們可以把耗時間(阻塞)的任務放到進程池中,然後指定回調函數(主進程負責執行),這樣主進程在執行回調函數時就省去了I/O的過程,直接拿到的是任務的結果。
1 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor 2 import requests 3 import os4 import time 5 6 def get(url): 7 print(‘%s GET %s‘ %(os.getpid(),url)) 8 response=requests.get(url) 9 if response.status_code == 200: 10 return {‘url‘:url,‘text‘:response.text} 11 12 def parse(res): 13 res=res.result() 14 url=res[‘url‘] 15 text=res[‘text‘] 16 print(‘%s parse %s res:%s‘ %(os.getpid(),url,len(text))) 17 18 if __name__ == ‘__main__‘: 19 urls = [ 20 ‘https://www.baidu.com‘, 21 ‘https://www.python.org‘, 22 ‘https://www.openstack.org‘, 23 ‘https://help.github.com/‘, 24 ‘http://www.sina.com.cn/‘ 25 ] 26 27 # p=ProcessPoolExecutor()28 # start=time.time() 29 # l=[] 30 # for url in urls: 31 # furture=p.submit(get,url) 32 # l.append(furture) 33 # p.shutdown(wait=True) 34 # 35 # for furture in l: 36 # parse(furture) 37 # 38 # print(time.time()-start) #4.504257440567017 39 40 p=ProcessPoolExecutor() 41 start=time.time() 42 for url in urls: 43 future=p.submit(get, url) 44 future.add_done_callback(parse) #parse(futrue) 45 p.shutdown(wait=True) 46 print(time.time()-start) #3.1761815547943115 47 print(os.getpid())
future=p.submit(get, url)
future.add_done_callback(parse) #parse(futrue) 把future對象傳給回調函數 parse 通過對象的 .result 獲取future的 return的值
也就是說如果使用回調函數, 子進程的函數必須要寫返回值。想要拿到返回值 必須要用 .result
python的學習之旅---回調機制