python greenlet 查看當前有多少個協程

greenlet可以實現協程,不過每一次都要人為的去指向下一個該執行的協程,顯得太過麻煩。python還有一個比greenlet更強大的並且能夠自動切換任務的模塊gevent
gevent每次遇到io操作,需要耗時等待時,會自動跳到下一個協程繼續執行。

⑵ python gevent threading 有什麼區別

Socket.IO是一個可以讓瀏覽器與伺服器實現實時通信的類Websocket的抽象。Gevent-socket是Socketio協議的一個python實現。 參考LearnBoost開發的Node.js的Socket.IO伺服器端實現,現在已經有多種語言的Socket.IO server實現了。

⑶ python協程gevent怎麼用

在學習gevent之前,你肯定要知道你學的這個東西是什麼。

官方描述gevent

gevent is a coroutine-based Python networking library that uses greenlet to provide a high-level synchronous API on top of the libev event loop.

翻譯:gevent是一個基於協程的Python網路庫。我們先理解這句,也是這次學習的重點——協程。

wiki描述協程

與子常式一樣,協程也是一種程序組件。相對子常式而言,協程更為一般和靈活,但在實踐中使用沒有子常式那樣廣泛。子常式的起始處是惟一的入口點,一旦退出即完成了子常式的執行,子常式的一個實例只會返回一次;協程可以通過yield來調用其它協程。通過yield方式轉移執行權的協程之間不是調用者與被調用者的關系,而是彼此對稱、平等的。協程允許多個入口點,可以在指定位置掛起和恢復執行。

沒看懂?沒關系,我也沒看懂,不過算是有點線索:子常式。

子常式

過程有兩種,一種叫子常式(Subroutine),通常叫Sub;另一種叫函數(Function)。底層實現機制是一樣的,區別在於,Sub只執行操作,沒有返回值;Function不但執行操作,並且有返回值。用過VB的應該會比較清楚這點。(原諒我用了網路)說到底子常式就是過程,我們一般叫它函數。

說到函數,我就想吐槽了,不明白為什麼要叫函數。很多時候我們寫一個函數是為了封裝、模塊化某個功能,它是一個功能、或者說是一個過程。因為它包含的是類似於流程圖那樣的具體邏輯,先怎樣做,然後怎樣做;如果遇到A情況則怎樣,如果遇到B情況又怎樣。個人覺得還是叫過程比較好,叫做函數就讓人很糾結了,難道因為回歸到底層還是計算問題,出於數學的角度把它稱為函數?這個略坑啊!為了符合大家的口味,我還是稱之為函數好了(其實我也習慣叫函數了%>_

講到函數,我們就往底層深入一點,看看下面的代碼

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

def a():

print "a start"

b()

print "a end"

def b():

print "b start"

c()

print "b end"

def c():

print "c start"

print "c end"

if __name__ == "__main__":

a()

a start

b start

c start

c end

b end

a end

對於這樣的結果大家肯定不會意外的。每當函數被調用,就會在棧中開辟一個棧空間,調用結束後再回收該空間。

假設一個這樣的場景:有個講台,每個人都可以上去發表言論,但是每次講台只能站一個人。現在a在上面演講,當他說到「大家好!」的時候,b有個緊急通知要告訴大家,所以a就先下來讓b講完通知,然後a再上講台繼續演講。如果用函數的思想模擬這個問題,堆棧示意圖是這樣的:

那什麼東西有這樣的能力呢?我們很快就可以想到進程、線程,但是你真的想使用進程、線程如此重量級的東西在這么簡單的程序上嗎?野蠻的搶占式機制和笨重的上下文切換!

還有一種程序組件,那就是協程。它能保留上一次調用時的狀態,每次重新進入該過程的時候,就相當於回到上一次離開時所處邏輯流的位置。協程的起始處是第一個入口點,在協程里,返回點之後是接下來的入口點。協程的生命期完全由他們的使用的需要決定。每個協程在用yield命令向另一個協程交出控制時都盡可能做了更多的工作,放棄控制使得另一個協程從這個協程停止的地方開始,接下來的每次協程被調用時,都是從協程返回(或yield)的位置接著執行。

從上面這些你就可以知道其實協程是模擬了多線程(或多進程)的操作,多線程在切換的時候都會有一個上下文切換,在退出的時候將現場保存起來,等到下一次進入的時候從保存的現場開始,繼續執行。

看下協程是怎樣實現的:

Python

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

  • import random

    from time import sleep

    from greenlet import greenlet

    from Queue import Queue

    queue = Queue(1)

    @greenlet

    def procer():

    chars = ['a', 'b', 'c', 'd', 'e']

    global queue

    while True:

    char = random.choice(chars)

    queue.put(char)

    print "Proced: ", char

    sleep(1)

    consumer.switch()

    @greenlet

    def consumer():

    global queue

    while True:

    char = queue.get()

    print "Consumed: ", char

    sleep(1)

    procer.switch()

    if __name__ == "__main__":

    procer.run()

    consumer.run()

  • 應用場景

    我們一直都在大談協程是什麼樣一個東西,卻從沒有提起協程用來幹嘛,這個其實大家分析一下就能夠知道。從上面的生產者——消費者問題應該能看出,它分別有兩個任務,假設交給兩個人去執行,但每次只能允許一個人行動。當緩沖區滿的時候,生產者是出於等待狀態的,這個時候可以將執行任務的權利轉交給消費者,當緩沖區空得時候,消費者是出於等待狀態的,這個時候可以將執行任務的權利轉交給生產者,是不是很容易聯想到多任務切換?然後想到線程?最後想到高並發?

    但同學們又會問,既然有了線程為什麼還要協程呢?因為線程是系統級別的,在做切換的時候消耗是特別大的,具體為什麼這么大等我研究好了再告訴你;同時線程的切換是由CPU決定的,可能你剛好執行到一個地方的時候就要被迫終止,這個時候你需要用各種措施來保證你的數據不出錯,所以線程對於數據安全的操作是比較復雜的。而協程是用戶級別的切換,且切換是由自己控制,不受外力終止。

    總結

    協程其實模擬了人類活動的一種過程。例如:你准備先寫文檔,然後修復bug。這時候接到電話說這個bug很嚴重,必須立即修復(可以看作CPU通知)。於是你暫停寫文檔,開始去填坑,終於你把坑填完了,你回來寫文檔,這個時候你肯定是接著之前寫的文檔繼續,難道你要把之前寫的給刪了,重新寫?這就是協程。那如果是子常式呢?那你就必須重新寫了,因為退出之後,棧幀就會被彈出銷毀,再次調用就是開辟新的棧空間了。

    總結:協程就是用戶態下的線程,是人們在有了進程、線程之後仍覺得效率不夠,而追求的又一種高並發解決方案。為什麼說是用戶態,是因為操作系統並不知道它的存在,它是由程序員自己控制、互相協作的讓出控制權而不是像進程、線程那樣由操作系統調度決定是否讓出控制權。

    ⑷ 在樹莓派上安裝python的gevent失敗不是此平台支持的車輪

    你安裝的不是Arm架構的wheel,搜索一下python for arm或python for arm64來了解一下。

    ⑸ python裡面哪些框架有

    Django: Py Web應用開發框架
    Diesel:基於Greenlet的事件I/O框架
    Flask:一個用Py編寫的輕量級回Web應用框架
    Cubes:輕量級Py OLAP框架
    Kartograph.py:創造矢答量地圖的輕量級Py框架
    Pulsar:Py的事件驅動並發框架
    Web2py:全棧式Web框架
    Falcon:構建雲API和網路應用後端的高性能Py框架
    Dpark:Py版的Spark
    Buildbot:基於Py的持續集成測試框架
    Zerorpc:基於ZeroMQ的高性能分布式RPC框架
    Bottle: 微型Py Web框架
    Tornado:非同步非阻塞IO的Py Web框架
    webpy: 輕量級的Py Web框架
    Scrapy:Py的爬蟲框架

    ⑹ python什麼框架比較好

    從GitHub中整理出的15個最受歡迎的Python開源框架。這些框架包括事件I/O,OLAP,Web開發,高性能網路通信,測試,爬蟲等。Django:PythonWeb應用開發框架Django應該是最出名的Python框架,GAE甚至Erlang都有框架受它影響。Django是走大而全的方向,它最出名的是其全自動化的管理後台:只需要使用起ORM,做簡單的對象定義,它就能自動生成資料庫結構、以及全功能的管理後台。Diesel:基於Greenlet的事件I/O框架Diesel提供一個整潔的API來編寫網路客戶端和伺服器。支持TCP和UDP。Flask:一個用Python編寫的輕量級Web應用框架Flask是一個使用Python編寫的輕量級Web應用框架。基於WerkzeugWSGI工具箱和Jinja2模板引擎。Flask也被稱為「microframework」,因為它使用簡單的核心,用extension增加其他功能。Flask沒有默認使用的資料庫、窗體驗證工具。Cubes:輕量級PythonOLAP框架Cubes是一個輕量級Python框架,包含OLAP、多維數據分析和瀏覽聚合數據(aggregateddata)等工具。Kartograph.py:創造矢量地圖的輕量級Python框架Kartograph是一個Python庫,用來為ESRI生成SVG地圖。Kartograph.py目前仍處於beta階段,你可以在virtualenv環境下來測試。Pulsar:Python的事件驅動並發框架Pulsar是一個事件驅動的並發框架,有了pulsar,你可以寫出在不同進程或線程中運行一個或多個活動的非同步伺服器。Web2py:全棧式Web框架Web2py是一個為Python語言提供的全功能Web應用框架,旨在敏捷快速的開發Web應用,具有快速、安全以及可移植的資料庫驅動的應用,兼容GoogleAppEngine。Falcon:構建雲API和網路應用後端的高性能Python框架Falcon是一個構建雲API的高性能Python框架,它鼓勵使用REST架構風格,盡可能以最少的力氣做最多的事情。Dpark:Python版的SparkDPark是Spark的Python克隆,是一個Python實現的分布式計算框架,可以非常方便地實現大規模數據處理和迭代計算。DPark由豆瓣實現,目前豆瓣內部的絕大多數數據分析都使用DPark完成,正日趨完善。Buildbot:基於Python的持續集成測試框架Buildbot是一個開源框架,可以自動化軟體構建、測試和發布等過程。每當代碼有改變,伺服器要求不同平台上的客戶端立即進行代碼構建和測試,收集並報告不同平台的構建和測試結果。Zerorpc:基於ZeroMQ的高性能分布式RPC框架Zerorpc是一個基於ZeroMQ和MessagePack開發的遠程過程調用協議(RPC)實現。和Zerorpc一起使用的ServiceAPI被稱為zeroservice。Zerorpc可以通過編程或命令行方式調用。Bottle:微型PythonWeb框架Bottle是一個簡單高效的遵循WSGI的微型pythonWeb框架。說微型,是因為它只有一個文件,除Python標准庫外,它不依賴於任何第三方模塊。Tornado:非同步非阻塞IO的PythonWeb框架Tornado的全稱是ToradoWebServer,從名字上看就可知道它可以用作Web伺服器,但同時它也是一個PythonWeb的開發框架。最初是在FriendFeed公司的網站上使用,FaceBook收購了之後便開源了出來。webpy:輕量級的PythonWeb框架webpy的設計理念力求精簡(Keepitsimpleandpowerful),源碼很簡短,只提供一個框架所必須的東西,不依賴大量的第三方模塊,它沒有URL路由、沒有模板也沒有資料庫的訪問。Scrapy:Python的爬蟲框架Scrapy是一個使用Python編寫的,輕量級的,簡單輕巧,並且使用起來非常的方便。

    ⑺ greenlet 支持python3嗎

    gevent是Python世界中最重要的非同步網路庫,可以大幅度提高系統的性能。最可貴的是,它允許我們幾乎不修改代碼,把同步程序變為非同步程序。使用的技術就是我們之前講過的monkey patch。

    另外,2016真的是轉向Python3的重要時點。前幾天scrapy剛宣布支持Python3,今天gevent又宣布支持Python3,轉向Python3的障礙已經越來越少了。各個公司還是早作打算為好啊~

    還有一個社區觀察就是,大多數流行的軟體包支持范圍都是Python2.7及Python>=3.4。所以給大家一個編碼建議:如果用Python2,只用Python2.7;如果使用Python3,請至少使用Python3.4,最好使用Python3.5。

    ⑻ python gevent 能解決並發狀態嗎

    1. gevent.server.StreamServer 會針對每個客戶端連接啟動一個greenlet處理,要注意的是,如果不循環監聽( 阻塞在read ),

    每個greenlet會在完成後立即退出,從而導致客戶端退出( 發送FIN_ACK給客戶端 )。這個問題折騰了一晚上,終於弄明白了。坑爹啊。。。

    2. 要非常仔細的檢查,greenlet處理的代碼,發現有可能阻塞IO的地方,盡量用gevent提供的庫。

    3. 一些第三方庫隱藏了自己的實現( 通常是直接封裝C庫),要使得gevent兼容它們,可以用monkey_patch,但不保證全部管用。

    4. 最後最後的一點,gevent的greenlet性能非常高,所以如果是用它作為並發的client端,那麼一定要注意,你的server端處理速度一定要足夠快!
    否則你的客戶端代碼會因為服務端的慢速,而失去了greenlet的優勢。

    ⑼ python gevent怎麼安裝

    gevent是第三方庫,從https://pypi.python.org/pypi/gevent/#downloads下載安裝,在下載文件目錄下,使用 命令:pip install xxx.whl 安裝即可。

    ⑽ Python用greenlet模塊報錯

    代碼貼上來啊,你怎麼用的都不知道,沒辦法看出來。
    要這樣用。gr2.switch()