歡迎光臨
每天分享高質量文章

Python自動化運維之高級函式

一、協程

1.1協程的概念

協程,又稱微執行緒,纖程。英文名Coroutine。一句話說明什麼是執行緒:協程是一種用戶態的輕量級執行緒。(其實並沒有說明白~)

那麼這麼來理解協程比較容易: 

執行緒是系統級別的,它們是由操作系統調度;協程是程式級別的,由程式員根據需要自己調度。我們把一個執行緒中的一個個函式叫做子程式,那麼子程式在執行過程中可以中斷去執行別的子程式;別的子程式也可以中斷回來繼續執行之前的子程式,這就是協程。也就是說同一執行緒下的一段代碼執行著執行著就可以中斷,然後跳去執行另一段代碼,當再次回來執行代碼塊的時候,接著從之前中斷的地方開始執行。

比較專業的理解是:

協程擁有自己的暫存器背景關係和棧。協程調度切換時,將暫存器背景關係和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器背景關係和棧。因此:協程能保留上一次呼叫時的狀態(即所有區域性狀態的一個特定組合),每次過程重入時,就相當於進入上一次呼叫的狀態,換種說法:進入上一次離開時所處邏輯流的位置。

1.2 協程的優缺點

協程的優點:

  1. 無需執行緒背景關係切換的開銷,協程避免了無意義的調度,由此可以提高性能(但也因此,程式員必須自己承擔調度的責任,同時,協程也失去了標準執行緒使用多CPU的能力)

  2. 無需原子操作鎖定及同步的開銷

  3. 方便切換控制流,簡化編程模型

  4. 高併發+高擴展性+低成本:一個CPU支持上萬的協程都不是問題。所以很適合用於高併發處理。

協程的缺點:

  1. 無法利用多核資源:協程的本質是個單執行緒,它不能同時將 單個CPU 的多個核用上,協程需要和行程配合才能運行在多CPU上.當然我們日常所編寫的絕大部分應用都沒有這個必要,除非是cpu密集型應用。

  2. 進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程式

2.1 yield實現協程

前文所述“子程式(函式)在執行過程中可以中斷去執行別的子程式;別的子程式也可以中斷回來繼續執行之前的子程式”,那麼很容易想到Python的yield,顯然yield是可以實現這種切換的。

執行結果:

由執行結果可以證明g現在就是生成器函式。

2.2 協程函式賦值過程

用的是yield的運算式形式,要先運行next(),讓函式初始化並停在yield,然後再send() ,send會在觸發下一次代碼的執行時,給yield賦值
next()和send() 都是讓函式在上次暫停的位置繼續運行,

執行結果:

需要註意的是每次都需要先運行next()函式,讓程式停留在yield位置。
如果有多個這樣的函式都需要執行next()函式,讓程式停留在yield位置。為了防止忘記初始化next操作,需要用到裝飾器來解決此問題

執行結果:

2,3 協程函式簡單應用

請給Tom投喂食物

執行結果:

2.4 協程函式的應用

實現linux中”grep -rl error “命令,過濾一個檔案下的子檔案、字檔案夾的內容中的相應的內容的功能程式。

首先瞭解一個OS模塊中的walk方法,能夠把引數中的路徑下的檔案夾打開並傳回一個元組:

傳回的是一個元組,第一個元素是檔案的路徑,第二個是檔案夾,第三個是該路徑下的檔案

這裡需要用到一個寫程式的思想:面向過程編程

二、面向過程編程

面向過程:核心是過程二字,過程及即解決問題的步驟,基於面向過程設計程式就是一條工業流水線,是一種機械式的思維方式。流水線式的編程思想,在設計程式時,需要把整個流程設計出來

優點:

1:體系結構更加清晰

2:簡化程式的複雜度

缺點:

可擴展性極其的差,所以說面向過程的應用場景是:不需要經常變化的軟體,如:linux內核,httpd,git等軟體

下麵就根據面向過程的思想完成協程函式應用中的功能

目錄結構:

程式流程

第一階段:找到所有檔案的絕對路徑

第二階段:打開檔案

第三階段:迴圈讀取每一行

第四階段:過濾“error”

第五階段:打印該行屬於的檔案名

第一階段:找到所有檔案的絕對路徑

g是一個生成器,就能夠用next()執行,每次next就是運行一次,這裡的運行結果是依次打開檔案的路徑

我們在打開檔案的時候需要找到檔案的絕對路徑,現在可以通過字串拼接的方法把第一部分和第三部分進行拼接

用迴圈打開:

結果:

將查詢出來的檔案和路徑進行拼接,拼接成絕對路徑

執行結果:

用函式實現:

為了把結果傳回給下一流程

第二階段:打開檔案

第三階段:迴圈讀出每一行內容

第四階段:過濾

第五階段:打印該行屬於的檔案名

執行結果:

作者:炫維

來源:http://xuanwei.blog.51cto.com/11489734/1953449

《Linux雲計算及運維架構師高薪實戰班》2018年11月26日即將開課中,120天衝擊Linux運維年薪30萬,改變速約~~~~

    *宣告:推送內容及圖片來源於網絡,部分內容會有所改動,版權歸原作者所有,如來源信息有誤或侵犯權益,請聯繫我們刪除或授權事宜。

    – END –


    赞(0)

    分享創造快樂