Python中Paramiko協程方式詳解

  什麼是協程程序員

  協程咱們能夠看作是一種用戶空間的線程。數組

  操做系統對齊存在一無所知,須要用戶本身去調度。服務器

  好比說進程,線程操做系統都是知道它們存在的。協程的話是用戶空間的線程,操做系統是不知道的。網絡

  爲何要使用協程多線程

  與線程不一樣,協程是本身主動讓出cpu,並交付它指望的下一個協程運行,而不是在任什麼時候候都有可能被系統調度打斷。所以協程的使用更加清晰易懂,而且多數狀況下不須要鎖機制。與線程相比,協程的切換由程序控制,發生在用戶空間而非內核控件,所以切換的代價很是的小。某種意義上,協程與線程的關係相似與線程與進程的關係,多個協程會在同一個線程的上下文之中運行。這樣程序很少線程好理解。來看一個視圖。併發

  好比說一個進程它有多個線程,可是一個線程內它又有多個協程,而後這些協程就是說,有用戶,就是程序員來講定義它在何時交出控制權,給其它協程來進行一些操做。ssh

  gevent簡介編輯器

  Python一個很著名的一個協程庫就是geventgevent是一個基於libev的併發庫。它爲各類併發和網絡相關的任務提供了鄭潔的API。在gevent中用到的主要模式是Greenlet,它是以C擴展模塊形式接入Python的輕量級協程。Greenlet所有運行在主程序操做系統進程的內部,但它們被協做式地調度。函數

  Python gevent APIspa

  gevent.spawn(func,args)建立greenlet

  gevent.sleep(seconds)greenlet上下文切換

  gevent.joinall(greenlets)阻塞當前流程,執行全部給定greenlet

  咱們來看一下視圖。

  好比說這段代碼它得執行是這樣的,不如說它gevent建立出來的協程它sleep就是切換出來,就會到其它程序中去運行。而後其它程序再會讓它在切換回來,它再回到原來的流程去運行這樣,就作了一個交互式的操做。這樣這張圖就很明白的表名了這些。

  利用gevent實現

  對原有操做進行修改,手動切換。

  就是把這個程序切換出去,然給其它協程去操做。

  打開編輯器

  怎麼改呢,這個是原來的查詢遠程機器的配置,這個好比說查詢它的當前的時間。Data的話咱們,這個都是在以前的課程講過。Process好比說ssh它這個配置把它的section傳過去。

   好比說ssh0

  而後咱們如何修改呢,其實就是在原有的基礎上讓它手動的去切換,怎麼切換咱們就gevent_process,例如說建立出這個對象我就把它切換出去,切換出去的時候,首先要引入這個gevent這個庫,調用它的sleep讓它手動的切換出去。不如說connect的時候在切換出去。

  建立gevent協程

  而後咱們就開始在主函數裏面。 就創建協程,創建協程其實很簡單好比它一個event=gevent.spawn,把協程的函數和它的參數傳遞進來。好比說它就是一個ssh0

  不如說咱們讓它joinalljoinall是一個數組,而後這咱們應該申請一個events,把新請的這個events放進來。咱們把這個events阻塞,讓這個進程等待全部協程的結束。咱們看一下。

  多個協程的話就很是簡單了,咱們之前也看到過,好比說這個task_num6咱們就把它遍歷,而後這個section就是這個樣子就是ssh+str(i)

  而後把section傳遞進去,咱們能夠看到好比說咱們能夠查詢六次,對六個機器進行查詢。

  而後咱們這樣就完成了,咱們能夠看一下它的耗時,把它耗時給打印出來,就是兩個的時間差

  它花費了3.80秒,咱們下去的話大概能夠根據以前的經驗,把這個順序執行跟這個協程式的執行,協程式的具體來講就是就是這臺機器服務器的狀態。這個過程它所發生時間其實它仍是一個時間優點的,只不過是在這個地方它是時間優點體現的不明顯,是由於咱們只有在應用進程,而後在主動的去切換這個協程。而後在這parmiko的內部咱們實際上是沒辦法用,利用這個協程的切換來,由於它內部是封裝起來的。只容許調用它現有的這些函數,咱們中間是沒辦法打斷它的。

  只有在這個具體的執行的時候,好比說兩個run_cmd之間咱們能夠加一個協程讓它切出去,好比說我這有查詢一個其它的。

  好比說以前的查詢它的內存,我能夠在這在切一次。

  這樣的話就主動地切換,就是說利用協程之間的操做的話,若是多個協程之間 咱們這樣切換的話它其實最終的效果是比順序執行的時候要好,它是利用了協程的這個有點。

  等待gevent協程結束。

 

原文連接:http://www.maiziedu.com/wiki/frame/coroutines/

相關文章
相關標籤/搜索