在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python自動(dòng)化運(yùn)維之協(xié)程函數(shù)賦值過程

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

一、協(xié)程

1.1 協(xié)程的概念

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

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

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

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

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

協(xié)程的缺點(diǎn):(1)無法利用多核資源:協(xié)程的本質(zhì)是個(gè)單線程,它不能同時(shí)將 單個(gè)CPU 的多個(gè)核用上,協(xié)程需要和進(jìn)程配合才能運(yùn)行在多CPU上.當(dāng)然我們?nèi)粘K帉懙慕^大部分應(yīng)用都沒有這個(gè)必要,除非是cpu密集型應(yīng)用。(2)進(jìn)行阻塞(Blocking)操作(如IO時(shí))會(huì)阻塞掉整個(gè)程序

二、Python中如何實(shí)現(xiàn)協(xié)程

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

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

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

執(zhí)行結(jié)果:

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

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

用的是yield的表達(dá)式形式,要先運(yùn)行next(),讓函數(shù)初始化并停在yield,然后再send() ,send會(huì)在觸發(fā)下一次代碼的執(zhí)行時(shí),給yield賦值

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

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')# 現(xiàn)在是運(yùn)行函數(shù),讓函數(shù)初始化next(builder)print(builder.send('包子'))print(builder.send('骨頭'))print(builder.send('菜湯'))

運(yùn)行結(jié)果:

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

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

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

def init(func): def wrapper(*args,**kwargs): builder = func(*args,**kwargs) next(builder) # 這個(gè)地方是關(guān)鍵可以使用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")# 現(xiàn)在是直接運(yùn)行函數(shù),無須再函數(shù)初始化print(builder.send('包子'))print(builder.send('骨頭'))print(builder.send('菜湯'))

執(zhí)行結(jié)果:

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

2.3 協(xié)程函數(shù)簡單應(yīng)用

請給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("投喂結(jié)束") return 0 else: builder.send(food)if __name__ == '__main__': food()

執(zhí)行結(jié)果:

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

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

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

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

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

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

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

三、面向過程編程

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

優(yōu)點(diǎn):1:體系結(jié)構(gòu)更加清晰2:簡化程序的復(fù)雜度

缺點(diǎn):可擴(kuò)展性極其的差,所以說面向過程的應(yīng)用場景是:不需要經(jīng)常變化的軟件,如:linux內(nèi)核,httpd,git等軟件下面就根據(jù)面向過程的思想完成協(xié)程函數(shù)應(yīng)用中的功能。

目錄結(jié)構(gòu):

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

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

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

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

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

用循環(huán)打開:

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

結(jié)果:

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

將查詢出來的文件和路徑進(jìn)行拼接,拼接成絕對路徑

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

執(zhí)行結(jié)果:

E:Pythonscript函數(shù)testaaile1.txtE:Pythonscript函數(shù)testaab1ile2.txtE:Pythonscript函數(shù)testaab2ile3.txt

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

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函數(shù) est")

為了把結(jié)果返回給下一流程

@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))

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

@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函數(shù) est')

執(zhí)行結(jié)果:

E:Pythonscript函數(shù)testaaile1.txtE:Pythonscript函數(shù)testaab2ile3.txt

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 自動(dòng)化
    +關(guān)注

    關(guān)注

    29

    文章

    5721

    瀏覽量

    81102
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4363

    瀏覽量

    63770
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4821

    瀏覽量

    85781

原文標(biāo)題:Python自動(dòng)化運(yùn)維之高級函數(shù)

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    誠聘高級運(yùn)自動(dòng)化工程師

    獵頭職位:高級運(yùn)自動(dòng)化工程師【合肥】工作職責(zé): 1、根據(jù)基礎(chǔ)架構(gòu)運(yùn)管理需求,規(guī)劃設(shè)計(jì)運(yùn)
    發(fā)表于 12-12 10:37

    為何運(yùn)人員要學(xué)Python

    運(yùn)必須懂開發(fā),不懂開發(fā)的運(yùn)維道路會(huì)越走越窄。特別是要學(xué)會(huì)Python開發(fā),Python能滿足絕大部分
    發(fā)表于 02-02 18:55

    Linux運(yùn)都要會(huì)哪些shell技能

    在充斥著各種的互聯(lián)網(wǎng)+的數(shù)字時(shí)代,Linux運(yùn)也越來越趨于自動(dòng)化方向發(fā)展,越來越多的運(yùn)工作者奔跑在了
    發(fā)表于 11-30 17:38

    ansible-first-book 自動(dòng)化運(yùn)工具

    ansible-first-book 自動(dòng)化運(yùn)工具
    發(fā)表于 09-08 09:31 ?5次下載

    配電自動(dòng)化實(shí)用運(yùn)指標(biāo)研究

    根據(jù)《配電自動(dòng)化實(shí)用化驗(yàn)收細(xì)則》中對配電自動(dòng)化運(yùn)考核要求,重點(diǎn)圍繞終端在線率、遙信動(dòng)作正確率、遙控使用率與遙控成功率四項(xiàng)指標(biāo)進(jìn)行考核。目前對配電
    發(fā)表于 03-05 14:55 ?0次下載

    厲害了!山東電力運(yùn)自動(dòng)化平臺(tái)正式投運(yùn)

    日前,國網(wǎng)山東省電力集團(tuán)公司通過了山東信息通信技術(shù)監(jiān)督裝備及運(yùn)支撐工具開發(fā)實(shí)施項(xiàng)目的驗(yàn)收,代表著運(yùn)自動(dòng)化平臺(tái)正式投
    發(fā)表于 04-30 11:18 ?4552次閱讀

    Ansible企業(yè)級自動(dòng)化運(yùn)探索的詳細(xì)資料說明

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

    城域網(wǎng)自動(dòng)化運(yùn)實(shí)現(xiàn)的關(guān)鍵點(diǎn)、難點(diǎn)和解決方案研究

      針對城域網(wǎng)運(yùn)自動(dòng)化水平較低、人工成本高且無法擺脫重復(fù)運(yùn)勞動(dòng)的現(xiàn)狀,本文探討了當(dāng)前城域網(wǎng)自動(dòng)化
    發(fā)表于 10-28 09:09 ?2788次閱讀
    城域網(wǎng)<b class='flag-5'>自動(dòng)化</b><b class='flag-5'>運(yùn)</b><b class='flag-5'>維</b>實(shí)現(xiàn)的關(guān)鍵點(diǎn)、難點(diǎn)和解決方案研究

    城域網(wǎng)是什么,其生命周期和自動(dòng)化運(yùn)應(yīng)用有哪些特點(diǎn)

    Labs 摘? 要針對城域網(wǎng)運(yùn)自動(dòng)化水平較低、人工成本高且無法擺脫重復(fù)運(yùn)勞動(dòng)的現(xiàn)狀,本文探討了當(dāng)前城域網(wǎng)
    的頭像 發(fā)表于 12-25 14:24 ?1270次閱讀

    Python后端項(xiàng)目的協(xié)是什么

    最近公司 Python 后端項(xiàng)目進(jìn)行重構(gòu),整個(gè)后端邏輯基本都變更為采用“異步”協(xié)的方式實(shí)現(xiàn)。看著滿屏幕經(jīng)過 async await(協(xié)
    的頭像 發(fā)表于 09-23 14:38 ?1443次閱讀

    Python協(xié)與JavaScript協(xié)的對比及經(jīng)驗(yàn)技巧

    前言以前沒怎么接觸前端,對 JavaScript 的異步操作不了解,現(xiàn)在有了點(diǎn)了解。一查發(fā)現(xiàn) Python 和 JavaScript 的協(xié)發(fā)展史簡直就是一毛一樣!這里大致做下橫向?qū)Ρ群涂偨Y(jié),便于
    的頭像 發(fā)表于 10-20 14:30 ?2057次閱讀

    使用Python腳本實(shí)現(xiàn)自動(dòng)化運(yùn)任務(wù)

    許多運(yùn)工程師會(huì)使用 Python 腳本來自動(dòng)化運(yùn)任務(wù)。Python 是一種流行的編程語言,具
    的頭像 發(fā)表于 04-08 10:36 ?1879次閱讀

    協(xié)的概念及協(xié)的掛起函數(shù)介紹

    協(xié)是一種輕量級的線程,它可以在單個(gè)線程中實(shí)現(xiàn)并發(fā)執(zhí)行。與線程不同,協(xié)不需要操作系統(tǒng)的上下文切換,因此可以更高效地使用系統(tǒng)資源。Kotlin 協(xié)
    的頭像 發(fā)表于 04-19 10:20 ?1059次閱讀

    Facebook群組自動(dòng)化python – 網(wǎng)絡(luò)自動(dòng)化

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

    網(wǎng)絡(luò)設(shè)備自動(dòng)化運(yùn)工具—ansible入門筆記介紹

    Ansible是一款自動(dòng)化運(yùn)工具,基于Python開發(fā),集合了眾多運(yùn)工具 (Puppet、CFengine、Chef、SaltStack
    的頭像 發(fā)表于 01-15 13:46 ?2470次閱讀
    網(wǎng)絡(luò)設(shè)備<b class='flag-5'>自動(dòng)化</b><b class='flag-5'>運(yùn)</b><b class='flag-5'>維</b>工具—ansible入門筆記介紹
    主站蜘蛛池模板: 天天噜天天干 | 亚洲国产婷婷综合在线精品 | 福利视频自拍偷拍 | 国产大乳喷奶水在线看 | 一区二区三区网站 | 三级网站在线播放 | 欧美com| 日本成人免费网站 | 黄色日批网站 | 午夜视频免费在线观看 | 天堂网站www天堂资源在线 | 国产网站黄 | 69japanese日本100| 日韩免费观看的一级毛片 | 五月天婷亚洲 | 永久黄网站色视频免费观看99 | 欧美黄色免费网站 | 啪啪网免费视频 | 天天摸天天碰中文字幕 | www.亚洲视频.com | 国产三级三级三级 | 亚洲色图欧美色 | 中文字幕天天干 | 爽好舒服快受不了了老师 | 国产免费资源 | 欧美影欧美影院免费观看视频 | 成人免费久久精品国产片久久影院 | www在线小视频免费 www资源 | 狠狠色 综合色区 | 中文在线1区二区六区 | 一级看片免费视频囗交 | 天天干天天日天天射天天操毛片 | 国产精品你懂的在线播放 | 日日干天天草 | 天天做天天爽爽快快 | 狠狠狠狠操 | 一二三四日本视频社区 | 狠狠色丁香久久婷婷 | 狠狠色丁香婷婷综合激情 | 猫色网站 | 欧美性淫爽www视频播放 |