性夜影院午夜看片,无码精品久久一区二区三区,婷婷成人丁香五月综合激情,校园春色 qvod,性调教室高h学校

Python自動化運維之高級函數(shù)

Python自動化運維之高級函數(shù)

一、協(xié)程

1.1協(xié)程的概念

協(xié)程,又稱微線程,纖程。英文名Coroutine。一句話說明什么是線程:協(xié)程是一種用戶態(tài)的輕量級線程。(其實并沒有說明白~)

那么這么來理解協(xié)程比較容易: 

線程是系統(tǒng)級別的,它們是由操作系統(tǒng)調(diào)度;協(xié)程是程序級別的,由程序員根據(jù)需要自己調(diào)度。我們把一個線程中的一個個函數(shù)叫做子程序,那么子程序在執(zhí)行過程中可以中斷去執(zhí)行別的子程序;別的子程序也可以中斷回來繼續(xù)執(zhí)行之前的子程序,這就是協(xié)程。也就是說同一線程下的一段代碼執(zhí)行著執(zhí)行著就可以中斷,然后跳去執(zhí)行另一段代碼,當再次回來執(zhí)行代碼塊的時候,接著從之前中斷的地方開始執(zhí)行。

比較專業(yè)的理解是:

協(xié)程擁有自己的寄存器上下文和棧。協(xié)程調(diào)度切換時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧。因此:協(xié)程能保留上一次調(diào)用時的狀態(tài)(即所有局部狀態(tài)的一個特定組合),每次過程重入時,就相當于進入上一次調(diào)用的狀態(tài),換種說法:進入上一次離開時所處邏輯流的位置。

1.2 協(xié)程的優(yōu)缺點

協(xié)程的優(yōu)點:

  1. 無需線程上下文切換的開銷,協(xié)程避免了無意義的調(diào)度,由此可以提高性能(但也因此,程序員必須自己承擔調(diào)度的責任,同時,協(xié)程也失去了標準線程使用多CPU的能力)

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

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

  4. 高并發(fā)+高擴展性+低成本:一個CPU支持上萬的協(xié)程都不是問題。所以很適合用于高并發(fā)處理。

協(xié)程的缺點:

  1. 無法利用多核資源:協(xié)程的本質是個單線程,它不能同時將 單個CPU 的多個核用上,協(xié)程需要和進程配合才能運行在多CPU上.當然我們?nèi)粘K帉懙慕^大部分應用都沒有這個必要,除非是cpu密集型應用。

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

2.1 yield實現(xiàn)協(xié)程

前文所述“子程序(函數(shù))在執(zhí)行過程中可以中斷去執(zhí)行別的子程序;別的子程序也可以中斷回來繼續(xù)執(zhí)行之前的子程序”,那么很容易想到Python的yield,顯然yield是可以實現(xiàn)這種切換的。

Python自動化運維之高級函數(shù)

執(zhí)行結果:

Python自動化運維之高級函數(shù)

由執(zhí)行結果可以證明g現(xiàn)在就是生成器函數(shù)。

2.2 協(xié)程函數(shù)賦值過程

用的是yield的表達式形式,要先運行next(),讓函數(shù)初始化并停在yield,然后再send() ,send會在觸發(fā)下一次代碼的執(zhí)行時,給yield賦值
next()和send() 都是讓函數(shù)在上次暫停的位置繼續(xù)運行,

Python自動化運維之高級函數(shù)

執(zhí)行結果:

Python自動化運維之高級函數(shù)

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

Python自動化運維之高級函數(shù)

執(zhí)行結果:

Python自動化運維之高級函數(shù)

2,3 協(xié)程函數(shù)簡單應用

請給Tom投喂食物

Python自動化運維之高級函數(shù)

執(zhí)行結果:

Python自動化運維之高級函數(shù)

2.4 協(xié)程函數(shù)的應用

實現(xiàn)Linux中"grep -rl error <目錄>"命令,過濾一個文件下的子文件、字文件夾的內(nèi)容中的相應的內(nèi)容的功能程序。

首先了解一個OS模塊中的walk方法,能夠把參數(shù)中的路徑下的文件夾打開并返回一個元組:

Python自動化運維之高級函數(shù)

返回的是一個元組,第一個元素是文件的路徑,第二個是文件夾,第三個是該路徑下的文件

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

二、面向過程編程

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

優(yōu)點:

1:體系結構更加清晰

2:簡化程序的復雜度

缺點:

可擴展性極其的差,所以說面向過程的應用場景是:不需要經(jīng)常變化的軟件,如:Linux內(nèi)核,httpd,git等軟件

下面就根據(jù)面向過程的思想完成協(xié)程函數(shù)應用中的功能

目錄結構:

Python自動化運維之高級函數(shù)

程序流程

第一階段:找到所有文件的絕對路徑

第二階段:打開文件

第三階段:循環(huán)讀取每一行

第四階段:過濾“error”

第五階段:打印該行屬于的文件名

第一階段:找到所有文件的絕對路徑

g是一個生成器,就能夠用next()執(zhí)行,每次next就是運行一次,這里的運行結果是依次打開文件的路徑

Python自動化運維之高級函數(shù)

我們在打開文件的時候需要找到文件的絕對路徑,現(xiàn)在可以通過字符串拼接的方法把第一部分和第三部分進行拼接

用循環(huán)打開:

Python自動化運維之高級函數(shù)

結果:

Python自動化運維之高級函數(shù)

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

Python自動化運維之高級函數(shù)

執(zhí)行結果:

Python自動化運維之高級函數(shù)

用函數(shù)實現(xiàn):

Python自動化運維之高級函數(shù)

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

Python自動化運維之高級函數(shù)

第二階段:打開文件

Python自動化運維之高級函數(shù)

第三階段:循環(huán)讀出每一行內(nèi)容

Python自動化運維之高級函數(shù)

第四階段:過濾

Python自動化運維之高級函數(shù)

第五階段:打印該行屬于的文件名

Python自動化運維之高級函數(shù)

執(zhí)行結果:

Python自動化運維之高級函數(shù)

作者:炫維

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

相關新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評如潮的Linux云計算運維、SRE、Devops、網(wǎng)絡安全、云原生、Go、Python開發(fā)專業(yè)人才培訓機構!