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


回調機制

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      

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM