使用gevent實現高效異步請求

《python異步爬蟲詳解》一文代碼太過繁瑣,謝謝

學習學習再學習”(博客園:Alex的盜版學生)
提到的使用猴子補丁的意見。今天重寫一下。

一、同步與異步
異步編程可以大幅度的提高系統的吞吐量,提高單位時間內發出的請求數目。之前大鄧寫的爬蟲都是同步,就是對aurl發起請求,等待響應。然後再訪問burl,等待響應。。。

大量的時間消耗在等待上,如果能近似的同時對多個網址發起請求,等待響應,速度回快很多倍。這裏的同時其實是爲了讓大家便於理解,其實所謂的同時也是有先後順序的,所以叫異步。

文字描述太彆扭,我們水平方向代表時間


#同步編程(同一時間只能做一件事,做完了才能做下一件事情)<-a_url-><-b_url-><-c_url->#異步編程 (可以近似的理解成同一時間有多個事情在做,但有先後)<-a_url->
  <-b_url->
    <-c_url->
      <-d_url->
        <-e_url->
          <-f_url->
            <-g_url->
              <-h_url->
                <--i_url-->
                  <--j_url-->

你看同步編程同樣的時間訪問了3個網址,但是異步編程訪問的效率提高了很多倍。

二、功能實現
2.1gevent簡介
gevent是一個python的併發庫,它爲各種併發和網絡相關的任務提供了整潔的API。

gevent中用到的主要模式是greenlet,它是以C擴展模塊形式接入Python的輕量級協程。 greenlet全部運行在主程序操作系統進程的內部,但它們被協作式地調度。

2.2 猴子補丁
昨天的分享的文章中也發現了requests庫是阻塞式的,也就無法像上面圖形那種,將requests同步更改爲異步。只有將requests庫阻塞式更改爲非阻塞,異步操作才能實現。

而gevent庫中的猴子補丁(monkey patch),gevent能夠修改標準庫裏面大部分的阻塞式系統調用。這樣在不改變原有代碼的情況下,將應用的阻塞式方法,變成協程式的(異步)。

三、代碼


from gevent import monkey
import gevent
import requests
import time

monkey.patch_all()

def req(url):
    print(url)
    resp = requests.get(url)
    print(resp.status_code,url)

def synchronous_times(urls):
    """同步請求運行時間"""
    start = time.time()
    for url in urls:
        req(url)
    end = time.time()
    print('同步執行時間 {} s'.format(end-start))

def asynchronous_times(urls):
    """異步請求運行時間"""
    start = time.time()
    gevent.joinall([gevent.spawn(req,url) for url in urls])
    end = time.time()
    print('異步執行時間 {} s'.format(end - start))

urls = ['https://book.douban.com/tag/小說','https://book.douban.com/tag/科幻',
        'https://book.douban.com/tag/漫畫','https://book.douban.com/tag/奇幻',
        'https://book.douban.com/tag/歷史','https://book.douban.com/tag/經濟學']

synchronous_times(urls)
asynchronous_times(urls)
https://book.douban.com/tag/小說
200 https://book.douban.com/tag/小說
https://book.douban.com/tag/科幻
200 https://book.douban.com/tag/科幻
https://book.douban.com/tag/漫畫
200 https://book.douban.com/tag/漫畫
https://book.douban.com/tag/奇幻
200 https://book.douban.com/tag/奇幻
https://book.douban.com/tag/歷史
200 https://book.douban.com/tag/歷史
https://book.douban.com/tag/經濟學
200 https://book.douban.com/tag/經濟學
同步執行時間 6.054782867431641 s
https://book.douban.com/tag/小說
https://book.douban.com/tag/科幻
https://book.douban.com/tag/漫畫
https://book.douban.com/tag/奇幻
https://book.douban.com/tag/歷史
https://book.douban.com/tag/經濟學
200 https://book.douban.com/tag/歷史
200 https://book.douban.com/tag/漫畫
200 https://book.douban.com/tag/小說
200 https://book.douban.com/tag/經濟學
200 https://book.douban.com/tag/奇幻
200 https://book.douban.com/tag/科幻
異步執行時間 1.114253044128418 s

異步請求效率是同步請求近5倍!!!再次感謝

微信暱稱:"學習學習再學習”(博客園:Alex的盜版學生)
教程及代碼下載
鏈接: https://pan.baidu.com/s/1miwyB5u 密碼: 4ffj

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章