精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python自動化運維之協程函數賦值過程

馬哥Linux運維 ? 來源:未知 ? 作者:李倩 ? 2018-03-18 11:22 ? 次閱讀

一、協程

1.1 協程的概念

協程,又稱微線程,纖程。英文名Coroutine。一句話說明什么是線程:協程是一種用戶態的輕量級線程。(其實并沒有說明白~)那么這么來理解協程比較容易:

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

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

1.2 協程的優缺點

協程的優點:(1)無需線程上下文切換的開銷,協程避免了無意義的調度,由此可以提高性能(但也因此,程序員必須自己承擔調度的責任,同時,協程也失去了標準線程使用多CPU的能力)(2)無需原子操作鎖定及同步的開銷(3)方便切換控制流,簡化編程模型(4)高并發+高擴展性+低成本:一個CPU支持上萬的協程都不是問題。所以很適合用于高并發處理。

協程的缺點:(1)無法利用多核資源:協程的本質是個單線程,它不能同時將 單個CPU 的多個核用上,協程需要和進程配合才能運行在多CPU上.當然我們日常所編寫的絕大部分應用都沒有這個必要,除非是cpu密集型應用。(2)進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程序

二、Python中如何實現協程

2.1 yield實現協程

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

def eater(name): print("%s eat food" %name) while True: food = yield print("done")g = eater("gangdan")print(g)

執行結果:

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

2.2 協程函數賦值過程

用的是yield的表達式形式,要先運行next(),讓函數初始化并停在yield,然后再send() ,send會在觸發下一次代碼的執行時,給yield賦值

next()和send() 都是讓函數在上次暫停的位置繼續運行:

def creater(name): print('%s start to eat food' %name) food_list = [] while True: food = yield food_list print('%s get %s ,to start eat' %(name,food)) food_list.append(food)# 獲取生成器builder = creater('tom')# 現在是運行函數,讓函數初始化next(builder)print(builder.send('包子'))print(builder.send('骨頭'))print(builder.send('菜湯'))

運行結果:

tom start to eat foodtom get 包子 ,to start eat['包子']tom get 骨頭 ,to start eat['包子', '骨頭']tom get 菜湯 ,to start eat['包子', '骨頭', '菜湯']

需要注意的是每次都需要先運行next()函數,讓程序停留在yield位置。

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

def init(func): def wrapper(*args,**kwargs): builder = func(*args,**kwargs) next(builder) # 這個地方是關鍵可以使用builder.send("None"),第一次必須傳入None。 return builder return wrapper@initdef creater(name): print('%s start to eat food' %name) food_list = [] while True: food = yield food_list print('%s get %s ,to start eat' %(name,food)) food_list.append(food)# 獲取生成器builder = creater("tom")# 現在是直接運行函數,無須再函數初始化print(builder.send('包子'))print(builder.send('骨頭'))print(builder.send('菜湯'))

執行結果:

tom start to eat foodtom get 包子 ,to start eat['包子']tom get 骨頭 ,to start eat['包子', '骨頭']tom get 菜湯 ,to start eat['包子', '骨頭', '菜湯']

2.3 協程函數簡單應用

請給Tom投喂食物:

def init(func): def wrapper(*args,**kwargs): builder = func(*args,**kwargs) next(builder) return builder return wrapper@initdef creater(name): print('%s start to eat food' %name) food_list = [] while True: food = yield food_list print('%s get %s ,to start eat' %(name,food)) food_list.append(food)def food(): builder = creater("Tom") while True: food = input("請給Tom投喂食物:").strip() if food == "q": print("投喂結束") return 0 else: builder.send(food)if __name__ == '__main__': food()

執行結果:

Tom start to eat food請給Tom投喂食物:骨頭Tom get 骨頭 ,to start eat請給Tom投喂食物:菜湯Tom get 菜湯 ,to start eat請給Tom投喂食物:q投喂結束

2.4 協程函數的應用

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

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

>>> import os # 導入模塊>>> os.walk(r"E:Pythonscript") #使用r 是讓字符串中的符號沒有特殊意義,針對的是轉義>>> g = os.walk(r"E:Pythonscript")>>> next(g)('E:\Python\script', ['.idea', '函數'], [])

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

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

三、面向過程編程

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

優點:1:體系結構更加清晰2:簡化程序的復雜度

缺點:可擴展性極其的差,所以說面向過程的應用場景是:不需要經常變化的軟件,如:linux內核,httpd,git等軟件下面就根據面向過程的思想完成協程函數應用中的功能。

目錄結構:

test├── aa│ ├── bb1│ │ └── file2.txt│ └── bb2│ └── file3.txt└─ file1.txt文件內容:file1.txt:error123file2.txt:123file3.txt:123error

程序流程:第一階段:找到所有文件的絕對路徑第二階段:打開文件第三階段:循環讀取每一行第四階段:過濾“error”第五階段:打印該行屬于的文件名第一階段:找到所有文件的絕對路徑

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

>>> import os>>> g = os.walk(r"E:Pythonscript函數 est")>>> next(g)('E:\Python\script\函數\test', ['aa'], [])>>> next(g)('E:\Python\script\函數\test\aa', ['bb1', 'bb2'], ['file1.txt'])>>> next(g)('E:\Python\script\函數\test\aa\bb1', [], ['file2.txt'])>>> next(g)('E:\Python\script\函數\test\aa\bb2', [], ['file3.txt'])>>> next(g)Traceback (most recent call last): File "", line 1, in StopIteration

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

用循環打開:

import osdir_g = os.walk(r"E:Pythonscript函數 est")for dir_path in dir_g: print(dir_path)

結果:

('E:\Python\script\函數\test', ['aa'], [])('E:\Python\script\函數\test\aa', ['bb1', 'bb2'], ['file1.txt'])('E:\Python\script\函數\test\aa\bb1', [], ['file2.txt'])('E:\Python\script\函數\test\aa\bb2', [], ['file3.txt'])

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

import osdir_g = os.walk(r"E:Pythonscript函數 est")for dir_path in dir_g: for file in dir_path[2]: file = "%s\%s" %(dir_path[0],file) print(file)

執行結果:

E:Pythonscript函數testaaile1.txtE:Pythonscript函數testaab1ile2.txtE:Pythonscript函數testaab2ile3.txt

用函數實現:

import osdef search(): while True: dir_name = yield dir_g = os.walk(dir_name) for dir_path in dir_g: for file in dir_path[2]: file = "%s\%s" %(dir_path[0],file) print(file)g = search()next(g)g.send(r"E:Pythonscript函數 est")

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

@init # 初始化生成器def search(target): while True: dir_name = yield dir_g = os.walk(dir_name) for pardir,_,files in dir_g: for file in files: abspath = r"%s%s" %(pardir,file) target.send(abspath)

第二階段:打開文件

@initdef opener(target): while True: abspath=yield with open(abspath,'rb') as f: target.send((abspath,f))

第三階段:循環讀出每一行內容

@initdef cat(target): while True: abspath,f=yield #(abspath,f) for line in f: res=target.send((abspath,line)) if res:break

第四階段:過濾

@initdef grep(pattern,target): tag=False while True: abspath,line=yield tag tag=False if pattern in line: target.send(abspath) tag=True

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

@initdef printer(): while True: abspath=yield print(abspath)g = search(opener(cat(grep('error'.encode('utf-8'), printer()))))g.send(r'E:Pythonscript函數 est')

執行結果:

E:Pythonscript函數testaaile1.txtE:Pythonscript函數testaab2ile3.txt

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 自動化
    +關注

    關注

    29

    文章

    5512

    瀏覽量

    79106
  • 函數
    +關注

    關注

    3

    文章

    4306

    瀏覽量

    62430
  • python
    +關注

    關注

    56

    文章

    4782

    瀏覽量

    84453

原文標題:Python自動化運維之高級函數

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    誠聘高級自動化工程師

    獵頭職位:高級自動化工程師【合肥】工作職責: 1、根據基礎架構管理需求,規劃設計
    發表于 12-12 10:37

    為何人員要學Python

    必須懂開發,不懂開發的維道路會越走越窄。特別是要學會Python開發,Python能滿足絕大部分
    發表于 02-02 18:55

    Linux都要會哪些shell技能

    在充斥著各種的互聯網+的數字時代,Linux也越來越趨于自動化方向發展,越來越多的工作者奔跑在了
    發表于 11-30 17:38

    ansible-first-book 自動化工具

    ansible-first-book 自動化工具
    發表于 09-08 09:31 ?5次下載

    配電自動化實用指標研究

    根據《配電自動化實用化驗收細則》中對配電自動化考核要求,重點圍繞終端在線率、遙信動作正確率、遙控使用率與遙控成功率四項指標進行考核。目前對配電
    發表于 03-05 14:55 ?0次下載

    厲害了!山東電力自動化平臺正式投

    日前,國網山東省電力集團公司通過了山東信息通信技術監督裝備及支撐工具開發實施項目的驗收,代表著自動化平臺正式投
    發表于 04-30 11:18 ?4438次閱讀

    Ansible企業級自動化探索的詳細資料說明

    本文檔的主要內容詳細介紹的是Ansible企業級自動化探索的詳細資料說明主要內容包括了:場景一:自動化
    發表于 06-03 08:00 ?2次下載
    Ansible企業級<b class='flag-5'>自動化</b><b class='flag-5'>運</b><b class='flag-5'>維</b>探索的詳細資料說明

    城域網自動化實現的關鍵點、難點和解決方案研究

      針對城域網自動化水平較低、人工成本高且無法擺脫重復勞動的現狀,本文探討了當前城域網自動化
    發表于 10-28 09:09 ?2558次閱讀
    城域網<b class='flag-5'>自動化</b><b class='flag-5'>運</b><b class='flag-5'>維</b>實現的關鍵點、難點和解決方案研究

    城域網是什么,其生命周期和自動化應用有哪些特點

    Labs 摘? 要針對城域網自動化水平較低、人工成本高且無法擺脫重復勞動的現狀,本文探討了當前城域網
    的頭像 發表于 12-25 14:24 ?1065次閱讀

    Python后端項目的是什么

    最近公司 Python 后端項目進行重構,整個后端邏輯基本都變更為采用“異步”的方式實現。看著滿屏幕經過 async await(
    的頭像 發表于 09-23 14:38 ?1306次閱讀

    Python與JavaScript的對比及經驗技巧

    前言以前沒怎么接觸前端,對 JavaScript 的異步操作不了解,現在有了點了解。一查發現 Python 和 JavaScript 的發展史簡直就是一毛一樣!這里大致做下橫向對比和總結,便于
    的頭像 發表于 10-20 14:30 ?1888次閱讀

    使用Python腳本實現自動化任務

    許多運工程師會使用 Python 腳本來自動化任務。Python 是一種流行的編程語言,具
    的頭像 發表于 04-08 10:36 ?1630次閱讀

    的概念及的掛起函數介紹

    是一種輕量級的線程,它可以在單個線程中實現并發執行。與線程不同,不需要操作系統的上下文切換,因此可以更高效地使用系統資源。Kotlin
    的頭像 發表于 04-19 10:20 ?868次閱讀

    Facebook群組自動化python – 網絡自動化

    電子發燒友網站提供《Facebook群組自動化python – 網絡自動化.zip》資料免費下載
    發表于 07-05 14:26 ?0次下載
    Facebook群組<b class='flag-5'>自動化</b><b class='flag-5'>python</b> – 網絡<b class='flag-5'>自動化</b>

    網絡設備自動化工具—ansible入門筆記介紹

    Ansible是一款自動化工具,基于Python開發,集合了眾多運工具 (Puppet、CFengine、Chef、SaltStack
    的頭像 發表于 01-15 13:46 ?1721次閱讀
    網絡設備<b class='flag-5'>自動化</b><b class='flag-5'>運</b><b class='flag-5'>維</b>工具—ansible入門筆記介紹