最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡(jiǎn)單了解python gevent 協(xié)程使用及作用

 更新時(shí)間:2019年07月22日 11:05:40   作者:jihite  
這篇文章主要介紹了簡(jiǎn)單了解python gevent 協(xié)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

簡(jiǎn)介

沒(méi)有切換開(kāi)銷。因?yàn)樽映绦蚯袚Q不是線程切換,而是由程序自身控制,沒(méi)有線程切換的開(kāi)銷,因此執(zhí)行效率高,

不需要鎖機(jī)制。因?yàn)橹挥幸粋€(gè)線程,也不存在同時(shí)寫變量沖突,在協(xié)程中控制共享資源不加鎖,只需要判斷狀態(tài)就好了,所以執(zhí)行效率比多線程高很多

Python對(duì)協(xié)程的支持還非常有限,用在generator中的yield可以一定程度上實(shí)現(xiàn)協(xié)程。

yield

傳統(tǒng)的生產(chǎn)者-消費(fèi)者模型是一個(gè)線程寫消息,一個(gè)線程取消息,通過(guò)鎖機(jī)制控制隊(duì)列和等待,但一不小心就可能死鎖。

如果改用協(xié)程,生產(chǎn)者生產(chǎn)消息后,直接通過(guò)yield跳轉(zhuǎn)到消費(fèi)者開(kāi)始執(zhí)行,待消費(fèi)者執(zhí)行完畢后,切換回生產(chǎn)者繼續(xù)生產(chǎn),效率極高

代碼

import time

def consumer():
  r = ''
  while True:
    n = yield r
    if not n:
      return
    print('[CONSUMER] Consuming %s....' % n)
    r = '200 OK'

def produce(c):
  c.next()
  n = 0
  while n < 5:
    n = n + 1
    print('[PRODUCER] Producing %s...' % n)
    r = c.send(n)
    print('[PRODUCER] Consumer return: %s\n' % r)
  c.close()

if __name__=='__main__':
  c = consumer()
  produce(c)

結(jié)果

[PRODUCER] Producing 1...
[CONSUMER] Consuming 1....
[PRODUCER] Consumer return: 200 OK

[PRODUCER] Producing 2...
[CONSUMER] Consuming 2....
[PRODUCER] Consumer return: 200 OK

[PRODUCER] Producing 3...
[CONSUMER] Consuming 3....
[PRODUCER] Consumer return: 200 OK

[PRODUCER] Producing 4...
[CONSUMER] Consuming 4....
[PRODUCER] Consumer return: 200 OK

[PRODUCER] Producing 5...
[CONSUMER] Consuming 5....
[PRODUCER] Consumer return: 200 OK

分析

  • 首先調(diào)用c.next()啟動(dòng)生成器
  • 然后,一旦生產(chǎn)了東西,通過(guò)c.send(n)切換到consumer執(zhí)行
  • consumer通過(guò)yield拿到消息,處理,又通過(guò)yield把結(jié)果傳回
  • produce拿到consumer處理的結(jié)果,繼續(xù)生產(chǎn)下一條消息

整個(gè)過(guò)程無(wú)鎖,由一個(gè)線程執(zhí)行,producer和consumer寫作完成任務(wù),所以叫做協(xié)程

gevent

Python通過(guò)yield提供了對(duì)協(xié)程的基本支持,但是不完全。而第三方的gevent為Python提供了比較完善的協(xié)程支持

gevent是第三方庫(kù),通過(guò)greenlet實(shí)現(xiàn)協(xié)程,其基本思想是:

當(dāng)一個(gè)greenlet遇到IO操作時(shí)(比如訪問(wèn)網(wǎng)絡(luò)),就自動(dòng)切換到其他的greenlet,等到IO操作完成,再在適當(dāng)?shù)臅r(shí)候切換回來(lái)繼續(xù)執(zhí)行。由于IO操作非常耗時(shí),經(jīng)常使程序處于等待狀態(tài),有了gevent為我們自動(dòng)切換協(xié)程,就保證總有g(shù)reenlet在運(yùn)行,而不是等待IO。

import gevent

def f(n):
  for i in range(n):
    print gevent.getcurrent(), i

g1 = gevent.spawn(f, 5)
g2 = gevent.spawn(f, 5)
g3 = gevent.spawn(f, 5)

g1.join()
g2.join()
g3.join()

結(jié)果

<Greenlet at 0x7f7216efbe10: f(5)> 0
<Greenlet at 0x7f7216efbe10: f(5)> 1
<Greenlet at 0x7f7216efbe10: f(5)> 2
<Greenlet at 0x7f7216efbe10: f(5)> 3
<Greenlet at 0x7f7216efbe10: f(5)> 4
<Greenlet at 0x7f720f54e0f0: f(5)> 0
<Greenlet at 0x7f720f54e0f0: f(5)> 1
<Greenlet at 0x7f720f54e0f0: f(5)> 2
<Greenlet at 0x7f720f54e0f0: f(5)> 3
<Greenlet at 0x7f720f54e0f0: f(5)> 4
<Greenlet at 0x7f720f54e190: f(5)> 0
<Greenlet at 0x7f720f54e190: f(5)> 1
<Greenlet at 0x7f720f54e190: f(5)> 2
<Greenlet at 0x7f720f54e190: f(5)> 3
<Greenlet at 0x7f720f54e190: f(5)> 4

可以看出3個(gè)greenlet依次運(yùn)行,而不是交替運(yùn)行

要讓greenlet交替運(yùn)行,可以通過(guò)gevent.sleep()交出控制權(quán)

import gevent

def f(n):
  for i in range(n):
    print gevent.getcurrent(), i
    gevent.sleep(1)

g1 = gevent.spawn(f, 3)
g2 = gevent.spawn(f, 3)
g3 = gevent.spawn(f, 3)

g1.join()
g2.join()
g3.join()

結(jié)果

<Greenlet at 0x7f74e2179e10: f(3)> 0
<Greenlet at 0x7f74da7cb0f0: f(3)> 0
<Greenlet at 0x7f74da7cb190: f(3)> 0
<Greenlet at 0x7f74e2179e10: f(3)> 1
<Greenlet at 0x7f74da7cb0f0: f(3)> 1
<Greenlet at 0x7f74da7cb190: f(3)> 1
<Greenlet at 0x7f74e2179e10: f(3)> 2
<Greenlet at 0x7f74da7cb0f0: f(3)> 2
<Greenlet at 0x7f74da7cb190: f(3)> 2

可以看出3個(gè)greenlet是交替執(zhí)行

如果把循環(huán)改為1000,讓執(zhí)行次數(shù)執(zhí)行時(shí)間長(zhǎng)些,查看進(jìn)程,可以看到線程只有一個(gè)。

當(dāng)然,實(shí)際代碼中,不可能用gevent.sleep()去切換協(xié)程,而是在執(zhí)行IO操作是,gevent自動(dòng)切換,參考代碼如下

import gevent
from gevent import monkey; monkey.patch_all()
import urllib2

def f(url):
  print 'GET: %s' % url
  resp = urllib2.urlopen(url)
  data = resp.read()
  print '[%d] bytes received from %s\n' %(len(data), url)

gevent.joinall([
gevent.spawn(f, 'http://www.cnblogs.com/kaituorensheng/'),
gevent.spawn(f, 'https://www.python.org/'),
gevent.spawn(f, 'https://www.baidu.com'),
])

執(zhí)行結(jié)果

GET: http://www.cnblogs.com/kaituorensheng/
GET: https://www.python.org/
GET: https://www.baidu.com
[227] bytes received from https://www.baidu.com

[14667] bytes received from http://www.cnblogs.com/kaituorensheng/

[47348] bytes received from https://www.python.org/

可以看到3個(gè)url結(jié)束順序并不是依次執(zhí)行完的。


使用gevent,可以獲得極高的并發(fā)性能,但gevent只能在Unix/Linux下運(yùn)行,在Windows下不保證正常安裝和運(yùn)行。

由于gevent是基于IO切換的協(xié)程,所以最神奇的是,我們編寫的Web App代碼,不需要引入gevent的包,也不需要改任何代碼,僅僅在部署的時(shí)候,用一個(gè)支持gevent的WSGI服務(wù)器,立刻就獲得了數(shù)倍的性能提升。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python處理中文標(biāo)點(diǎn)符號(hào)大集合

    Python處理中文標(biāo)點(diǎn)符號(hào)大集合

    中文文本中可能出現(xiàn)的標(biāo)點(diǎn)符號(hào)來(lái)源比較復(fù)雜,通過(guò)匹配等手段對(duì)他們處理的時(shí)候需要格外小心,防止遺漏,下面小編給大家?guī)?lái)了Python處理中文標(biāo)點(diǎn)符號(hào)大集合,感興趣的朋友跟隨腳本之家小編一起看看吧
    2018-05-05
  • Python unittest 自動(dòng)識(shí)別并執(zhí)行測(cè)試用例方式

    Python unittest 自動(dòng)識(shí)別并執(zhí)行測(cè)試用例方式

    這篇文章主要介紹了Python unittest 自動(dòng)識(shí)別并執(zhí)行測(cè)試用例方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-03-03
  • python元組的概念知識(shí)點(diǎn)

    python元組的概念知識(shí)點(diǎn)

    在本篇文章里我們給各位整理的是關(guān)于python元組的概念知識(shí)點(diǎn)以及實(shí)例內(nèi)容,需要的朋友們參考下。
    2019-11-11
  • django項(xiàng)目中使用云片網(wǎng)發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn)

    django項(xiàng)目中使用云片網(wǎng)發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn)

    這篇文章主要介紹了django項(xiàng)目中使用云片網(wǎng)發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 如何使用Python快速生成gif圖

    如何使用Python快速生成gif圖

    這篇文章主要給大家介紹了關(guān)于如何使用Python快速生成gif圖的相關(guān)資料,我們需要用到 imageio 庫(kù),文章通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • pycharm通過(guò)ssh遠(yuǎn)程連接服務(wù)器并運(yùn)行代碼詳細(xì)圖文

    pycharm通過(guò)ssh遠(yuǎn)程連接服務(wù)器并運(yùn)行代碼詳細(xì)圖文

    在運(yùn)行項(xiàng)目的過(guò)程中,由于自己電腦GPU不夠,通常需要將項(xiàng)目放到服務(wù)器上運(yùn)行,這時(shí)就會(huì)遇到如何將pycharm和服務(wù)器進(jìn)行連接,下面這篇文章主要給大家介紹了關(guān)于pycharm通過(guò)ssh遠(yuǎn)程連接服務(wù)器并運(yùn)行代碼的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • pytorch實(shí)現(xiàn)onehot編碼轉(zhuǎn)為普通label標(biāo)簽

    pytorch實(shí)現(xiàn)onehot編碼轉(zhuǎn)為普通label標(biāo)簽

    今天小編就為大家分享一篇pytorch實(shí)現(xiàn)onehot編碼轉(zhuǎn)為普通label標(biāo)簽,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-01-01
  • pandas DataFrame.shift()函數(shù)的具體使用

    pandas DataFrame.shift()函數(shù)的具體使用

    本文主要介紹了pandas DataFrame.shift()函數(shù)的使用,pandas DataFrame.shift()函數(shù)可以把數(shù)據(jù)移動(dòng)指定的位數(shù),有需要了解pandas DataFrame.shift()用法的朋友可以參考一下
    2021-05-05
  • 淺談python 中類屬性共享的問(wèn)題

    淺談python 中類屬性共享的問(wèn)題

    今天小編就為大家分享一篇淺談python 中類屬性共享的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • Python中find()的用法小結(jié)

    Python中find()的用法小結(jié)

    Python中find()函數(shù)用于在字符串中查找目標(biāo)字符或子字符串,并返回索引,本文就來(lái)介紹一下Python中find()的用法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-12-12

最新評(píng)論

安吉县| 汽车| 平和县| 桐梓县| 蚌埠市| 无棣县| 嘉兴市| 辽阳县| 邢台市| 道孚县| 吉林市| 南岸区| 和龙市| 林西县| 乐至县| 朔州市| 宜宾市| 武强县| 武汉市| 大英县| 唐山市| 海盐县| 如皋市| 田阳县| 华池县| 太谷县| 陈巴尔虎旗| 元朗区| 云霄县| 赤峰市| 喀喇沁旗| 太和县| 永城市| 贵州省| 乌兰察布市| 定远县| 禹城市| 正阳县| 平山县| 东源县| 孝感市|