成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

網(wǎng)絡(luò)異步請(qǐng)求之gevent

pcChao / 3138人閱讀

摘要:我們知道對(duì)于網(wǎng)絡(luò)請(qǐng)求這種的場(chǎng)景來(lái)說(shuō),最怕的就是某個(gè)請(qǐng)求阻塞了其余的操作,讓并發(fā)性大大降低。同步首先我們來(lái)看看傳統(tǒng)的請(qǐng)求。結(jié)論我又多試了幾次,的效率確實(shí)牛,遠(yuǎn)遠(yuǎn)高于同步請(qǐng)求。

我們知道對(duì)于網(wǎng)絡(luò)請(qǐng)求這種IO bound的場(chǎng)景來(lái)說(shuō),最怕的就是某個(gè)請(qǐng)求阻塞了其余的操作,讓并發(fā)性大大降低。今天就來(lái)介紹一款python下的并發(fā)庫(kù)-gevent。

首先看一下他自己的介紹:

gevent是一個(gè)基于libev的并發(fā)庫(kù)。它為各種并發(fā)和網(wǎng)絡(luò)相關(guān)的任務(wù)提供了整潔的API。

嗯,確實(shí)很簡(jiǎn)潔,很易使用。待會(huì)我們就見(jiàn)識(shí)到了。

同步IO

首先我們來(lái)看看傳統(tǒng)的IO請(qǐng)求。
比如我們請(qǐng)求:http://httpbin.org/ip 發(fā)個(gè)http get請(qǐng)求會(huì)得到我們的ip地址,如:

{
  "origin": "183.240.202.14"
}

我們來(lái)寫個(gè)腳本連續(xù)發(fā)50個(gè)get請(qǐng)求到這個(gè)地址,以模擬多個(gè)請(qǐng)求。(腳本命名為get.py)

import requests

url = "http://httpbin.org/ip"

for i in range(50):
    print("{}: {}".format(i, requests.get(url).text))

統(tǒng)計(jì)一下運(yùn)行時(shí)間:

$ time python3 get.py

(輸出略...)
python3 get.py  0.56s user 0.06s system 1% cpu 35.606 total

大概花費(fèi)35s鐘,當(dāng)然不同網(wǎng)絡(luò)環(huán)境可能結(jié)果不同。而且打印出來(lái)的結(jié)果是按照1, 2, 3...50這樣的順序來(lái)的,說(shuō)明整個(gè)請(qǐng)求是同步的,一個(gè)請(qǐng)求結(jié)束再發(fā)下一個(gè)請(qǐng)求。

使用gevent

我們?cè)賮?lái)寫一個(gè)gevent版的get.py,命名為gevent_get.py

import requests
import gevent
import gevent.monkey
# 這里將socket變成異步
gevent.monkey.patch_socket()

url = "http://httpbin.org/ip"


def hello(i):
    print("{}: {}".format(i, requests.get(url).text))


tasks = [gevent.spawn(hello, i) for i in range(50)]
gevent.joinall(tasks)

再來(lái)看看運(yùn)行時(shí)間:

$ time python3 gevent_get.py

(輸出略...)
python3 gevent_get.py  0.49s user 0.06s system 39% cpu 1.403 total

我的天!才1.4秒左右,而且打印出來(lái)的結(jié)果沒(méi)有按照1, 2, 3...50這樣排列,而是按照隨機(jī)順序排列的,說(shuō)明整個(gè)請(qǐng)求是異步非阻塞的。

結(jié)論

我又多試了幾次,gevent的效率確實(shí)牛,遠(yuǎn)遠(yuǎn)高于同步io請(qǐng)求。最近在我的一個(gè)爬蟲(chóng)小項(xiàng)目里面用進(jìn)程池 + gevent,爬取80個(gè)頁(yè)面,大概花費(fèi)40s左右,每個(gè)頁(yè)面只要0.5s,而且還包括DOM解析的時(shí)間,而用同步請(qǐng)求則花費(fèi)大概300s左右。

gevent的更多用法請(qǐng)參考其官方文檔。這么簡(jiǎn)單又好用的庫(kù)趕緊試試吧。^_^

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/45515.html

相關(guān)文章

  • Python協(xié)程(真才實(shí)學(xué),想學(xué)的進(jìn)來(lái))

    摘要:所以與多線程相比,線程的數(shù)量越多,協(xié)程性能的優(yōu)勢(shì)越明顯。值得一提的是,在此過(guò)程中,只有一個(gè)線程在執(zhí)行,因此這與多線程的概念是不一樣的。 真正有知識(shí)的人的成長(zhǎng)過(guò)程,就像麥穗的成長(zhǎng)過(guò)程:麥穗空的時(shí)候,麥子長(zhǎng)得很快,麥穗驕傲地高高昂起,但是,麥穗成熟飽滿時(shí),它們開(kāi)始謙虛,垂下麥芒。 ——蒙田《蒙田隨筆全集》 上篇論述了關(guān)于python多線程是否是雞肋的問(wèn)題,得到了一些網(wǎng)友的認(rèn)可,當(dāng)然也有...

    lykops 評(píng)論0 收藏0
  • 一起讀 Gevent 源碼

    摘要:一旦有事件產(chǎn)生可能是一次出現(xiàn)好多個(gè)事件,就會(huì)按照優(yōu)先級(jí)依次調(diào)用每個(gè)事件的回調(diào)函數(shù)。注意,是有超時(shí)的,所以一些無(wú)法以文件描述符的形式存在的事件也可以有機(jī)會(huì)被觸發(fā)。 這一篇主要想跟大家分享一下 Gevent 實(shí)現(xiàn)的基礎(chǔ)邏輯,也是有同學(xué)對(duì)這個(gè)很感興趣,所以貼出來(lái)跟大家一起分享一下。 Greenlet 我們知道 Gevent 是基于 Greenlet 實(shí)現(xiàn)的,greenlet 有的時(shí)候也被...

    tainzhi 評(píng)論0 收藏0
  • python基礎(chǔ)教程:異步IO 概念和歷史

    摘要:并發(fā)的方式有多種,多線程,多進(jìn)程,異步等。多線程和多進(jìn)程之間的場(chǎng)景切換和通訊代價(jià)很高,不適合密集型的場(chǎng)景關(guān)于多線程和多進(jìn)程的特點(diǎn)已經(jīng)超出本文討論的范疇,有興趣的同學(xué)可以自行搜索深入理解。 編程中,我們經(jīng)常會(huì)遇到并發(fā)這個(gè)概念,目的是讓軟件能充分利用硬件資源,提高性能。并發(fā)的方式有多種,多線程,多進(jìn)程,異步IO等。多線程和多進(jìn)程更多應(yīng)用于CPU密集型的場(chǎng)景,比如科學(xué)計(jì)算的時(shí)間都耗費(fèi)在CPU...

    BicycleWarrior 評(píng)論0 收藏0
  • 談?wù)凱ython協(xié)程技術(shù)的演進(jìn)

    摘要:事件循環(huán)是異步編程的底層基石。對(duì)事件集合進(jìn)行輪詢,調(diào)用回調(diào)函數(shù)等一輪事件循環(huán)結(jié)束,循環(huán)往復(fù)。協(xié)程直接利用代碼的執(zhí)行位置來(lái)表示狀態(tài),而回調(diào)則是維護(hù)了一堆數(shù)據(jù)結(jié)構(gòu)來(lái)處理狀態(tài)。時(shí)代的協(xié)程技術(shù)主要是,另一個(gè)比較小眾。 Coding Crush Python開(kāi)發(fā)工程師 主要負(fù)責(zé)豈安科技業(yè)務(wù)風(fēng)險(xiǎn)情報(bào)系統(tǒng)redq。 引言 1.1. 存儲(chǔ)器山 存儲(chǔ)器山是 Randal Bryant 在《深入...

    zhiwei 評(píng)論0 收藏0
  • python---協(xié)程

    摘要:隨著我們對(duì)于效率的追求不斷提高,基于單線程來(lái)實(shí)現(xiàn)并發(fā)又成為一個(gè)新的課題,即只用一個(gè)主線程很明顯可利用的只有一個(gè)情況下實(shí)現(xiàn)并發(fā)。作為的補(bǔ)充可以檢測(cè)操作,在遇到操作的情況下才發(fā)生切換協(xié)程介紹協(xié)程是單線程下的并發(fā),又稱微線程,纖程。 引子 之前我們學(xué)習(xí)了線程、進(jìn)程的概念,了解了在操作系統(tǒng)中進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位。按道理來(lái)說(shuō)我們已經(jīng)算是把cpu的利用率提高很多了。...

    lolomaco 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<