安裝:html
pip3 install aiohttp
pip3 install grequests
pip3 install wheel
pip3 install scrapy
注意:python
windows上scrapy依賴 https://sourceforge.net/projects/pywin32/files/sql
安裝Twistedwindows
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.whlscrapy
爲何須要異步請求呢?async
若是是正常的請求,一個請求結束後才能開啓下一個請求[串行請求],若是期間有一個請求一次,則後面的請求都會終止。tornado
若是是相似多線程的異步請求,則由多個線程同時開啓多個請求,一個請求的異常不會影響其餘
實現IO操做有3種方式:
同步 【串行操做】
多進程【更消耗資源,有操做系統調用】 --> 更適合計算密集型操做由於須要併發操做,消耗CPU
線程是計算機工做的最小單元
多線程【有CPU進行調用,節省資源】 --> 更適合多IO操做,由於發送請求後不消耗CPU資源
進程中至少有一個線程,默認都有一個主線程且共享進程的內部資源
多協程 --> 一個進程內一個線程完成多個任務【能夠同時接收多個請求,而後在一個一個的處理請求】
若是遇到阻塞則執行下一個請求,若是阻塞的請求收到回覆後執行剛纔阻塞的那個請求【回調實現】,效率比多線程還高.
注:線程裏面有GIL【global Interpreter lock】,Python裏面有個GIL鎖[該鎖保障同時間1個進程內只容許1個線程操做],不容許CPU操做多個線程,不容許CPU調用資源[也就是限制了CPU,即限制了多線程]。可是線程能夠進行IO操做,多個線程能夠同時進行多個IO操做[URL 請求等,由於CPU的只須要發送一下便可,發送後不消耗cpu資源],
利用多線程實現IO的異步操做:
import requests from concurrent.futures.thread import ThreadPoolExecutor pool = 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 ProcessPoolExecutor import requests pool = ProcessPoolExecutor(5) # 建立進程池,也能夠理解爲多線程了這裏 pool.submit(async_url, url) # async_url是個方法,url是傳遞過去參數 pool.shutdown() # 關閉進程
Python學習---IO的異步[asyncio模塊(no-http)]
Python學習---IO的異步[gevent+Grequests模塊]