導航:首頁 > 編程語言 > python生命渡船

python生命渡船

發布時間:2022-04-18 12:33:23

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寫生命游戲(Game of Life)

    搜索一下有很多啦
    http://plife.sourceforge.net/
    http://www.daniweb.com/code/snippet217028.html#

    ③ Python培訓機構哪個好

    人工智慧時代來臨,未來十年,人工智慧是未來的趨勢。哪個編程語言最適合人工智慧人,當然首選python,前景非常好,無論你現在是一個程序員,還是想轉行IT學編程,python都是一個不錯的選擇。最好選擇培訓「人工智慧+python」,並且在IT行業運營了很多年,口碑非常不錯的機構。

    ④ 小白學python怎麼快速入門多久能完成一個項目

    電子書集合|數據科學速查表|遷移學習實戰 ,免費下載

    鏈接: https://pan..com/s/11qnpoLX1H_XzFB-RdVNG4w 提取碼: z9x7


    ⑤ 一個老師帶著25個學生去劃船,每條船最多坐4人,用python編寫程序問需要多少條

    25//4+int(25%4!=0)

    ⑥ python函數中僅允許使用一條return語句嗎為什麼

    如果函數執行了return語句,那麼函數的生命就結束了,return 語句後面的代碼都不會執行。所以准確的說,函數里只能執行一次return語句,但可以寫多條return語句。比如這樣:

    deftest_return(x):
    ifx>0:
    returnx
    else:
    return0

    ⑦ python生命周期怎麼設置

    第一部分
    最近在寫Python的時候發現一個好玩的現象,就是在if else重定義的變數,沒有聲明全局,在外部也可以使用,
    這里涉及到一個python變數生命周期的問題。
    python能夠改變變數作用域的代碼段是def、class、lamda.
    if/elif/else、try/except/finally、for/while 並不能涉及變數作用域的更改,
    也就是說他們的代碼塊中的變數,在外部也是可以訪問的
    變數搜索路徑是:本地變數->全局變數

    ⑧ 想學python從哪裡入手

    Python適用於網站、桌面應用開發,自動化腳本,復雜計算系統,科學計算,生命支持管理系統,物聯網,游戲,機器人,自然語言處理等很多方面。而且,既使對於那些從沒有開發經驗的人來講,Python的代碼也是簡潔易懂的。所以,有不少人會選擇Python專業的學習。

    作為一門優美、精巧的編程語言,Python不僅僅適合作為編程入門,對於希望掌握實戰開發技能進而從事編程工作的人來說,Python也是一個很不錯的選擇。
    Python的初學者說一說入門的學習路徑。
    1、建立開發環境
    建立開發環境非常重要,。做任何開發,首先就是要把這個環境准備好,之後就可以去做各種嘗試,嘗試過程中的話就能逐漸建立信心。初學者往往在環境配置中被各種預想不到的問題弄得很沮喪。
    2、了解編程語言基礎
    有了工作環境後,我們就可以開始編寫和執行Python程序了。
    Python這類腳本程序其實就像是一段「電影腳本」,按照從前往後的順序規定了一系列的動作,指揮著你電腦的CPU、硬碟、操作系統等部件干這干那。所以為了讓電腦能夠看懂,你編寫的這段「電影腳本」需要按照電腦所使用的語言進行編寫。例如print("hello world!")這樣一句話就會讓電腦調用一系列部件,最後在屏幕上輸出它對世界的問好;而a=3+5這樣一句話就會讓電腦計算3+5的答案,然後將答案放入一個名字為a的「盒子」當中。
    3、掌握數據結構基礎
    為了能夠完成更復雜的計算場景,Python提供了若干種內置的數據結構。所謂數據結構,你可以認為一組變數以某個特定的方式組織在一起,而不僅僅是單個獨立的變數。通過特定的組織方式,在處理某些運算時能夠能夠大大提高編程的效率。數據結構是計算機專業的一門必修專業課,更高級的數據結構及其內部實現方式你需要專門學習,不過Python的數據結構可以是一個非常好的學習起點。
    4、掌握函數的基本概念
    在實際編寫程序的過程中,某些代碼可能會反復執行多次。而這些代碼除了變數不同外,沒有任何的區別。這些代碼實際上類似於數學表達式中的函數f(x),當我們給x賦值時,就會得到對應的結果。在Python中也提供了這樣的特性,同樣稱之為「函數」。
    函數將需要反復使用的代碼進行模塊化,從而減少了代碼的重復,同時還增加了可讀性和可維護性。當需要修改時,只要改變定義內的代碼,就可以完成對每一次執行的修改。
    5、面向對象編程
    面向對象是一種非常符合人類思維的編程方法,因為現實世界就是由對象和對象之間的交互來構成的,所以我們其實很容易將現實世界映射到軟體開發中。舉個例子,一輛汽車、一篇博客、一個人,對應到軟體系統中都是一個對象;而對象具有自己的狀態和行為。
    6、學習函數式編程
    也許你還覺得函數式編程很陌生,但許多的函數式編程風格已經漸漸開始流行。什麼叫函數式編程呢?事實上只要語言將函數作為一等公民(或者藉助工具達到類似效果) 就可以支持函數式編程。而將函數作為一等公民意味著函數可以像變數一樣傳參、賦值和返回。函數式編程的書寫方式使得代碼編寫的效率更加高,極大地提高生產效率。
    7、掌握更多標准庫中的模塊

    ⑨ 用python語言編寫程序,解決問題:一個老師帶著25個學生去劃船,每條船做4個人,問需要多少條船

    import math
    print(ceil((25+1)/4))
    # ceil函數:返回不小於指定值的最小整數。

    ⑩ Python是什麼

    也許最初設計Python這種語言的人並沒有想到今天Python會在工業和科研上獲得如此廣泛的使用。著名的自由軟體作者Eric Raymond在他的文章《如何成為一名黑客》中,將Python列為黑客應當學習的四種編程語言之一,並建議人們從Python開始學習編程。這的確是一個中肯的建議,對於那些從來沒有學習過編程或者並非計算機專業的編程學習者而言,Python是最好的選擇之一。Python第一次學習Python,我只用了不到二十分鍾的時間,站在書店裡把一本教初學編程的人學習Python的書翻了一遍。也是從那時起,我開始被這種神奇的語言吸引。 Python可以用來開發symbian上的東西。 易用與速度的完美結合Python是一種用起來很方便的語言,很多初學Java的人都會被Java的CLASSPATH搞得暈頭轉向,花上半天的時間才搞明白原來是CLASSPATH搞錯了自己的Hello World才沒法運行。用Python就不會有這種問題,只要裝上就能直接用。 Python是一種腳本語言,寫好了就可以直接運行,省去了編譯鏈接的麻煩,對於需要多動手實踐的初學者而言,也就是少了出錯的機會。而且Python還有一種交互的方式,如果是一段簡單的小程序,連編輯器都可以省了,直接敲進去就能運行。Python是一種清晰的語言,用縮進來表示程序的嵌套關系可謂是一種創舉,把過去軟性的編程風格升級為硬性的語法規定。再不需要在不同的風格間選擇、再不需要為不同的風格爭執。與Perl不同,Python中沒有各種隱晦的縮寫,不需要去強記各種奇怪的符號的含義。Python寫的程序很容易懂,這是不少人的共識。Python是一種面向對象的語言,但它的面向對象卻不象C++那樣強調概念,而是更注重實用。不是為了體現對概念的完整支持而把語言搞得很復雜,而是用最簡單的方法讓編程者能夠享受到面向對象帶來的好處,這正是Python能像Java、C#那樣吸引眾多支持者的原因之一。 Python是一種功能豐富的語言,它擁有一個強大的基本類庫和數量眾多的第三方擴展,使得Python程序員無需去羨慕Java的JDK。Python為程序員提供了豐富的基本功能使得人們寫程序時用不著一切最底層做起。說到這里,人們通常會用一種擔心:腳本語言通常很慢。腳本語言從運行的速度講的確會慢一些,但Python的速度卻比人們想像得快很多。雖然Python是一種腳本語言,但實際上也可以對它進行編譯,就象編譯Java程序一樣將Python程序編譯為一種特殊的ByteCode,在程序運行時,執行的是ByteCode,省去了對程序文本的分析解釋,速度自然提升很多。在用Java編程是,人們崇尚一種Pure Java的方式,除了虛擬機一切東西都用Java編寫,無論是基本的數據結構還是圖形界面,而Pure Java的SWING,卻成為無數Java應用開發者的噩夢。Python崇尚的是實用,它的整體環境是用C來編寫的,很多基本的功能和擴展的模塊都是用C/C++來編寫的,當執行這一部分代碼時,它的速度就是C的速度。用Python編寫的普通桌面程序,其啟動運行速度與用C寫的程序差別不大。除了這些,通過一些第三方軟體包,用Python編寫的源代碼還可以以類似JIT的方式運行,而這可以大大提高Python代碼的運行速度,針對不同類型的代碼,會有2倍至100倍不等的速度提升。 Python是我見到過的語言中,在易用性和速度上結合的最完美的一個,通過喪失一點點經常可以忽略不計的運行速度從而獲得更高的編程效率,這就是我選擇Python的原因。把精力放在要解決的問題上選擇一種合適的語言,才能讓你把有限的精力放到最需要解決的問題上。不同的語言有不同的作用,C和匯編適合編寫系統軟體,如果用它們來編寫企業應用,恐怕沒幾個人能得心應手。我以前就碰到一個用匯編寫資料庫程序的哥,雖然最基本的功能完成了,但要增加個報表預覽什麼的,他就沒法應付了。聰明的程序員是用合適的工具去完成任務,想找一把萬能鑰匙是不太可能的。Python的自動的垃圾回收機制是高級的編程語言的一種基本特性,用擁有這一功能的語言編程,程序員們通常不用去關心內存泄漏的問題,而當我們用C/C++寫程序時,這卻是最重要的需要認真考慮卻又很容易出錯的問題之一。數據結構是程序構成的重要部分,鏈表、樹、圖這些在用C編程時需要仔細表達的問題在Python中簡單了很多。在Python中,最基本的數據結構就是數組、序列和哈希表,用它們想要表達各種常見的數據結構是非常容易的。沒了定義指針、分配內存的任務,編程變得有趣了。CORBA是一種高級的軟體體系結構,它是語言無關平台無關的。C++、Java等語言都有CORBA綁定,但與它們相比,Python的CORBA綁定卻容易很多,因為在程序員看來,一個CORBA的類和Python的類用起來以及實現起來並沒有什麼差別。沒了復雜體系結構的困擾,用Python編寫CORBA程序也變得容易了。好鋼要用在刀刃上,要想用有限的時間完成盡量多的任務,就要把各種無關的問題拋棄,而Python恰恰提供了這種方法。跨平台又易擴展隨著Linux的不斷成熟,越來越多的人轉到Linux平台上工作,軟體的開發者自然就希望自己編寫的軟體可以在所有平台下運行。Java一次編寫處處運行的口號使它成為跨平台的開發工具的典範,但其運行速度卻不被人們看好。實際上,幾乎所有的著名腳本語言都是跨平台的,Python也不例外。Python不僅支持各種Linux/Unix系統,還支持Windows,甚至在Palm上都可以運行Python的程序。一個程序想要跨平台工作,不僅僅需要語言本身能夠做到在平台之間兼容,在圖形化界面的時代,還需要有能跨平台工作的Widget。Python不僅支持老一些的TK,還支持新的GTK+、QT以及wxWidget,而這些Widgets都可以在多個平台上工作。通過它們,程序員就可以編寫出漂亮的跨平台GUI程序。Python通常是運行在native代碼與腳本代碼之間,程序員可以用C/C++為Python編寫各種各樣的模塊,這不僅可以讓程序員以Python的方式使用系統的各種服務及用C/C++編寫的優秀函數庫和類庫,還可以大幅度提高Python程序的速度。用C/C++編寫Python的模塊並不復雜,而且為了簡化這一工作,人們還製作了不少工具用來協助這一工作。正是因為如此,現在各種常用的函數庫和類庫都有Python語言的綁定,用Python可以做到的事情越來越多了。萬能鑰匙?Python功能強大,但它卻不是萬能的。如果你要編寫操作系統或驅動程序,很顯然,Python是做不到的。要寫軟體,沒有哪個工具是萬能的,現在之所以有那麼多的編程語言,就是因為不同的語言適合做不同的事情。因此,選擇適合自己的語言工具是最重要的。

    閱讀全文

    與python生命渡船相關的資料

    熱點內容
    安卓qq瀏覽器怎麼轉換到ios 瀏覽:292
    不同編譯器的庫可以調用嗎 瀏覽:455
    灰度信託基金加密 瀏覽:421
    宿遷程序員兼職網上接單 瀏覽:924
    電視編譯器怎麼設置 瀏覽:276
    手機如何解壓漢字密碼的壓縮包 瀏覽:701
    為什麼很多程序員愛用vim 瀏覽:828
    安卓手機怎麼連接寶華韋健音響 瀏覽:555
    12星座製作解壓球 瀏覽:867
    java調用oracle數據 瀏覽:827
    怎麼在伺服器上上傳小程序源碼 瀏覽:304
    空中加油通達信指標公式源碼 瀏覽:38
    分卷解壓只解壓了一部分 瀏覽:760
    php網站自動登錄 瀏覽:705
    合肥凌達壓縮機招聘 瀏覽:965
    怎麼找到文件夾的圖標 瀏覽:235
    linuxc編程pdf百度雲 瀏覽:190
    會計pdf下載 瀏覽:833
    c開源cf源碼 瀏覽:951
    如何取消掉添加進app資源庫 瀏覽:732