1. 程式人生 > >python的學習之旅---回調機制

python的學習之旅---回調機制

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 os
4 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的學習之旅---回調機制