標籤:toolbar ima ons 執行 就是 1.0 process 效率 twisted
1.1.1.
前期環境準備和基礎知識
安裝:
pip3 install aiohttp
pip3 install grequests
pip3 install wheel
pip3 install scrapy
注意:
windows上scrapy依賴 https://sourceforge.net/projects/pywin32/files/
安裝Twisted
a. http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted,
b. 下載:Twisted-17.1.0-cp35-cp35m-win_amd64.whl
c. 進入檔案所在目錄
d. pip3 install Twisted-17.1.0-cp35-cp35m-win_amd64.whl
實現IO操作的方式
為什麼需要非同步請求呢?
如果是正常的請求,一個請求結束後才能開啟下一個請求[串列請求],如果期間有一個請求一次,則後面的請求都會終止。
如果是類似多線程的非同步請求,則由多個線程同時開啟多個請求,一個請求的異常不會影響其他
實現IO操作有3種方式:
同步 【串列操作】
多進程【更消耗資源,有作業系統調用】 --> 更適合計算密集型操作因為需要並行作業,消耗CPU
線程是電腦工作的最小單元
多線程【有CPU進行調用,節省資源】 --> 更適合多IO操作,因為發送請求後不消耗CPU資源
進程中至少有一個線程,預設都有一個主線程且共用進程的內部資源
多協程 --> 一個進程內一個線程完成多個任務【可以同時接收多個請求,然後在一個一個的處理請求】
如果遇到阻塞則執行下一個請求,如果阻塞的請求收到回複後執行剛才阻塞的那個請求【回調實現】,效率比多線程還高.
註:線程裡面有GIL【global Interpreter lock】,Python裡面有個GIL鎖[該鎖保障同時間1個進程內只允許1個線程操作],不允許CPU操作多個線程,不允許CPU調用資源[也就是限制了CPU,即限制了多線程]。但是線程可以進行IO操作,多個線程可以同時進行多個IO操作[URL 請求等,因為CPU的只需要發送一下即可,發送後不消耗cpu資源],
利用多線程實現IO的非同步作業:
import requestsfrom concurrent.futures.thread import ThreadPoolExecutorpool = ThreadPoolExecutor(5) # 建立線程池,也可以理解為多線程了這裡url_list = [ ‘https://www.baidu.com/‘, ‘https://www.taobao.com/‘, ‘https://www.google.com/search‘, ‘https://hao.360.cn/‘,]def async_url(url): try: response = requests.get(url) print(‘正常請求:‘, ‘【‘, url, ‘】‘, response.content) except Exception as e: print(‘異常請求:‘, e)for url in url_list: print(‘請求開始:‘, url) pool.submit(async_url, url)pool.shutdown() # 關閉線程
後台顯示結果:
利用多進程實現IO的非同步作業:
[其他同上]from concurrent.futures.process import ProcessPoolExecutorimport requestspool = ProcessPoolExecutor(5) # 建立進程池,也可以理解為多線程了這裡pool.submit(async_url, url) # async_url是個方法,url是傳遞過去參數pool.shutdown() # 關閉進程
非同步IO_1---asyncio模組(no-http)
Python學習---IO的非同步[asyncio模組(no-http)]
非同步IO_2---gevent+Grequests
Python學習---IO的非同步[gevent+Grequests模組]
非同步IO_3---twisted模組
Python學習---IO的非同步[twisted模組]
非同步IO_4---tornado模組
Python學習---IO的非同步[tornado模組]
自訂非同步IOPython學習---IO的非同步[自訂非同步IO]
Python學習---Python的非同步IO[all]