Python學習---Python的異步IO[all]

image

1.1.1. 前期環境準備和基礎知識

安裝:html

pip3 install aiohttp

image

pip3 install grequests

image

pip3 install wheel

image

pip3 install scrapy

image

注意: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併發

image

c. 進入文件所在目錄異步

d. pip3 install Twisted-17.1.0-cp35-cp35m-win_amd64.whlscrapy

image

 

實現IO操做的方式

 

爲何須要異步請求呢?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()   # 關閉線程

後臺顯示結果:

image

利用多進程實現IO的異步操做:

[其餘同上]
from concurrent.futures.process import ProcessPoolExecutor
import requests
pool = 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模塊]

自定義異步IO

相關文章
相關標籤/搜索