色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

Python中進程的操作

冬至配餃子 ? 來源:多蘭多 ? 作者:Toranto ? 2022-08-19 09:45 ? 次閱讀

進程、線程、協程

一、什么是進程

進程是計算機中的程序關于某數據集合的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。

在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向進程設計的計算機結構中,進程是線程的容器。

程序是指令、數據及其組織形式的描述,進程是程序的實體。

狹義定義:進程是正在運行的程序的實例。

廣義定義∶進程是一個具有一定獨立功能的程序關于某個數據集合的一次運行活動。它是操作系統動態執行的基本單元,在傳統的操作系統中,進程既是基本的分配單元,也是基本的執行單元。

注意:同一個程序執行兩次,就會在操作系統中出現兩個進程,所以我們可以同時運行一個軟件,分別做不同的事情也不會混亂。

每個進程都有自己獨立的一塊內存空間,一個進程可以有多個線程,比如在Windows系統中,一個運行的xx.exe就是一個進程。

pYYBAGL-6XyAGGD1AAFdmUgrRBg903.png

二、什么是線程

進程中的一個執行任務(控制單元),負責當前進程中程序的執行。一個進程至少有一個線程,一個進程可以運行多個線程,多個線程可共享數據。

與進程不同的是同類的多個線程共享進程的方法區資源,但每個線程有自己的程序計數器、虛擬機棧本地方法棧,所以系統在產生一個線程,或是在各個線程之間作切換工作時,負擔要比進程小得多,也正因為如此,線程也被稱為輕量級進程。

pYYBAGL-6aWAfUFqAAE7SCVP410887.png

三、進程和線程的區別

根本區別進程是操作系統資源分配的基本單位,而線程是處理器任務調度和執行的基本單位;

內存分配

同一進程的線程共享本進程的地址空間和資源,而進程之間的地址空間和資源是相互獨立的;

影響關系

一個進程崩潰后,在保護模式下不會對其他進程產生影響,但是一個線程崩潰整個進程都死掉。所以多進程要比多線程健壯。

四、協程

協程(Coroutines)是一種比線程更加輕量級的存在。協程完全由程序所控制(在用戶態執行),帶來的好處是性能大幅度的提升。

一個操作系統中可以有多個進程;一個進程可以有多個線程;同理,一個線程可以有多個協程。

協程是一個特殊的函數,這個函數可以在某個地方掛起,并且可以重新在掛起處繼續運行。一個線程內的多個協程的運行是串行的,這點和多進程(多線程)在多核CPU上執行時是不同的。多進程(多線程)在多核CPU上是可以并行的。當線程內的某一個協程運行時,其它協程必須掛起。

進程微觀

一、進程調度

要想多個進程交替運行,操作系統必須對這些進程進行調度,這個調度也不是隨機進行的,而是需要遵循一定的法則,由此就有了進程的調度算法。

先來先服務調度算法(先來后到)

短作業優先調度算法(進程的復雜程度不同)

時間片輪轉法(分配時間片)

多級反饋隊列(分級)

二、進程的并行和并發

poYBAGL-6cKASMXHAAFPfJdJR3c069.png

a.并行:并行是指兩者同時執行,比如賽跑,兩個人都在不停的往前跑;i、(資源夠用,比如三個進程,四核的cpu)

b.并發:并發是指資源有限的情況下,兩者交替輪流使用資源,比如一座橋(單核cpu)同時只能過一個人,A走一段后,讓給B,B用完繼續給A,交替使用,目的是提高效率。

c.區別:i.并行是從微觀上,也就是在一個精確的時間片刻,有不同的程序在執行,這就要求必須有多個處理器。ii.并發是從宏觀上,在一個時間段上可以看出是同時執行的,比如一個服務器同時處理多個請求。

三、進程的狀態

時間片即CPU分配給各個程序的時間,每個線程被分配一個時間段,稱作它的時間片,即該進程允許運行的時間,使各個程序從表面上看是同時進行的。

運行程序會創建進程,然后將進程提交到操作系統,操作系統進行進程調度,此時就會進入就緒、運行狀態(時間片輪轉會導致兩種狀態相互切換),如果在運行中遇到阻塞事件就會停滯進入阻塞狀態(不管是不是阻塞IO,一個線程等待io操作時都會被操作系統掛起,不消耗CPU。),直到等到信號的傳遞。

pYYBAGL-6dqAMN4oAABBQ1zLZP0800.png

就緒狀態:當進程已分配到除CPU以外的所有必要的資源,只要獲得處理機可立即執行,這時的進程狀態稱為就緒狀態。執行、運行:當程序已獲得處理機,其程序正在處理機上執行,此時的進程狀態稱為執行狀態。

阻塞:由于等待某個事件發生而無法執行時,便放棄處理機而處于阻塞狀態。引進進程阻塞的事件可有多種,例如,等待I/O完成(IO是輸入input輸出output的首字母縮寫形式)、申請緩沖區不能滿足、等待信號等。

同步、異步

同步:

就是一個任務的完成需要依賴另一個任務時,只有等待被依賴的任務完成后,依賴的任務才能完成,這是一種可靠的任務序列。要么成功都成功,失敗都失敗,兩個任務的狀態可以保持一致。

#同步  兩件事  一件做完再做另外一件

異步:

是不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什么工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了,至于被依賴的任務最終是否完成,依賴它的任務無法確定,所以它是不可靠的任務序列。

# 異步  兩件事  同時做



進程的創建

但凡是硬件,都需要有操作系統去管理,只要有操作系統,就有進程的概念,就需要有創建進程的方式。

對于通用操作系統(跑很多應用程序),需要有系統運行過程中創建或撤銷進程的能力,主要分成4種形式創建新的進程:

系統初始化(運行在后臺并且只在需要時才喚醒的進程)

一個進程在運行過程中開啟了子進程(如nginx開啟多進程)

用戶的交互請求,而創建一個進程(如雙擊大家都熟悉的快播)

一個批處理作業的初始化(只在大型機的批處理系統中應用)

無論哪一種,

新進程的創建都是由一個已近存在的進程執行了一個用于創建進程的系統調用而創建的

進程的結束:正常退出、出錯退出、嚴重錯誤、被其他進程殺死。

Python中進程的操作

之前我們已經了解了很多進程相關的理論知識,了解進程是什么應該不再困難了,剛剛我們已經了解了,運行中的程序就是進程。所有的進程都是通過它的父進程來創建的。因此,運行起來的Python程序也是一個進程,那么我們也可以在程序中再創建進程。多個進程可以實現并發效果,也就是說,當我們的程序中存在多個進程的時候,在某些時候,就會讓程序的執行速度變快。以我們之前所學的知識,并不能實現創建進程這個功能,所以我們就需要借助Python程序中強到大的模塊——multiprocessing。

仔細來說,multiprocessing不是一個模塊而是Python中一個操作、管理進程的包。之所以叫multi是取自multiple的多功能的意思,在這個包中幾乎包含了和進程有關的所有子模塊。由于提供的子模塊非常多,為了方便大家歸類記憶我們分成四個部分:創建進程部分、進程同步部分、進程池部分、進程之間數據共享。

一、multiprocessing.Process模塊

Process模塊是一個創建進程的模塊,語法格式為:

Process(target=運行的函數的內存地址,name=自定義進程名稱可不寫,args=(參數))
poYBAGL-6geAAEhHAAB-6Rda_r8942.png

思考:Pycharm、py文件所在的進程、子進程p是同步還是異步?

py文件的運行必須要建立在pycharm的基礎上嗎?

很明顯不用,pycharm只是一個編譯器,只是一個更方便我們編程的工具而已,所以肯定是異步的。

問題很多的小明就要問了:那你子進程p要建立在py文件的基礎上啊。

那我們檢驗一下:

pYYBAGL-6iyADKziAAC42MnDUsw220.png

pYYBAGL-6jGABCsPAACFeQpWsjw045.png

從運行結果來看,子進程和父進程是同時執行的,所以它們其實也是異步的。

二、Why __name__ =='__main__' ?

為什么要寫if __name_=='__main__': ?

只要是在windows系統上,并且創建子進程,那么就必須寫。

原因是不同操作系統之間創建子進程的方式不一樣,具體表現為:

Python多進程中,對于子進程的運行機制是:每個子進程中,由于不同的進程之間有獨立內存,不會共享,所以每個子進程是通過分別導入所在的腳本模塊來實現目標函數的運行的。對于這個機制,有以下兩點需要特別注意。

由于每個子進程是通過導入所在腳本的模塊實現模塊中函數的調用的,所以,為了避免將創建子進程的語句也被導入(因為這樣就會造成無限循環創建子進程,這顯然是不允許的,因此python禁止了在子進程中再創建子進程,否則會報錯),創建子進程的語句必須在if __name__=='__main__'語句之后定義,或者如果創建子進程的語句是定義在一個函數中的,那么這個函數調用必須在if __name__=='__main__'語句之后,這是python多進程中的強制性語法規則。

由于子進程可直接調用的是被導入模塊中的屬性,因此,子進程中的目標函數應該是被導入的,這樣子進程才可以調用到期需要的目標函數,因此,目標函數必須在if __name__=='__main__'語句之前定義,如果是在該語句之后定義,那么由于被導入時這部分是不會被導入的,所以運行時就會報"被導入的主模塊沒有目標函數屬性"這樣的錯誤

三、能否給子進程傳參?

試一試不就知道了:

pYYBAGL-6leAAjqWAADH1y4wzFI766.png

四、進程間的數據隔離(數據不共享)

poYBAGL-6mqAUnAJAAB5nHkJ164114.png

按照我們的理解,num在經過global的聲明之后,在全局中其表現形式應該發生了改變,但是我們看結果:

pYYBAGL-6n6AA7r0AABogUVo224471.png


子進程與父進程的變量的num仍然沒有發生改變,說明進程間數據是不共享的,有各自的內存池。

五、如何開啟多進程

就...正常...開啟...

pYYBAGL-6pyAMzJNAACVNkd6MIc939.pngpYYBAGL-5_CAFcRvAABXEcoRNqU369.png

六、子進程和父進程的關系

pYYBAGL-6r-Ab30BAABzffrTxoA478.png

poYBAGL-6sWAMNKXAACaFYr_TkM416.png

父進程和子進程的啟動是異步的;

父進程只負責通知操作系統啟動子進程;

接下來的工作由操作系統接手,父進程繼續執行;

父進程的代碼執行完畢之后并不會直接結束程序,需要等全部子進程執行完畢;

父進程要負責回收子進程的資源。



審核編輯:劉清

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

    關注

    1

    文章

    1634

    瀏覽量

    49160
  • python
    +關注

    關注

    56

    文章

    4797

    瀏覽量

    84776
  • 進程
    +關注

    關注

    0

    文章

    203

    瀏覽量

    13964
收藏 人收藏

    評論

    相關推薦

    操作系統中進程調度策略有哪幾種

    操作系統中進程調度策略有哪幾種? 求大神指點啊
    發表于 11-07 21:18

    Linux系統中進程如何查看及控制

    Linux系統中進程的查看及控制
    發表于 06-09 08:34

    uClinux進程調度器的實現分析

    分享到:標簽:uClinux 調度策略 進程調度器 摘要:針對操作系統中進程的調度機制,依次對其調度方式、調度策略、調度時機進行了分析,并結合uClinux中進程調度實現的核心源代碼,
    發表于 11-06 14:30 ?0次下載

    Linux和UNIX可以用什么命令查看運行中進程的相關信息

      你可以使用ps命令。它能顯示當前運行中進程的相關信息,包括進程的PID。Linux和UNIX都支持ps命令,顯示所有運行中進程的相關信息。ps命令能提供一份當前進程的快照。如果你想
    發表于 01-20 09:42 ?6471次閱讀

    嵌入式Linux中進程調度怎樣來解析

    處理機(CPU)是整個計算機系統的核心資源,在多進程操作系統中,進程數往往多于處理機數,這將導致各進程互相爭奪處理機。
    發表于 11-06 11:54 ?723次閱讀

    使用Python進程的理由

    Python 是運行在解釋器中的語言,查找資料知道, python 中有一個全局鎖( GI),在使用多進程( Threa)的情況下,不能發揮多核的優勢。而使用多進程( Multipro
    的頭像 發表于 04-04 16:50 ?1609次閱讀
    使用<b class='flag-5'>Python</b>多<b class='flag-5'>進程</b>的理由

    程序中進程和線程常見的19個問題

    計數器、寄存器和程序變量的當前值。 簡單來說進程就是一個程序的執行流程,內部保存程序運行所需的資源。 在操作系統中可以有多個進程在運行,可對于CPU來說,同一時刻,一個CPU只能運行一個進程
    的頭像 發表于 12-26 10:17 ?1964次閱讀
    程序<b class='flag-5'>中進程</b>和線程常見的19個問題

    Python對txt進行讀寫操作

    Python對txt進行讀寫操作
    的頭像 發表于 01-11 15:16 ?828次閱讀

    python列表序列操作教程

    python列表也是序列對象,可以進行序列通用的操作,類似字符串序列的操作
    的頭像 發表于 02-23 15:04 ?658次閱讀

    Python進程學習

    Python進程 (Multiprocessing) 是一種同時利用計算機多個處理器核心 (CPU cores) 進行并行處理的技術,它與 Python 的多線程 (Multithreading
    的頭像 發表于 04-26 11:04 ?558次閱讀

    程序中進程和線程的區別

    什么是進程 1、進程和線程的區別 進程是指正在運行的程序,它擁有獨立的內存空間和系統資源,不同進程之間的數據不共享。進程是資源分配的基本單位
    的頭像 發表于 06-22 11:39 ?679次閱讀
    程序<b class='flag-5'>中進程</b>和線程的區別

    操作系統中進程同步介紹

    進程同步 動畫展示,臨界區的資源,在某個時刻,只能有一個進程在使用。 臨界資源 一旦有對資源的共享,就必然涉及競爭限制。 臨界資源用來表示一種,公共資源或者說是共享數據,可以被多個線程使用。 但是
    的頭像 發表于 10-08 15:42 ?1124次閱讀
    <b class='flag-5'>操作</b>系統<b class='flag-5'>中進程</b>同步介紹

    網絡中進程之間如何通信

    我們深諳信息交流的價值,那網絡中進程之間如何通信,如我們每天打開瀏覽器瀏覽網頁時,瀏覽器的進程怎么與web服務器通信的?當你用QQ聊天時,QQ進程怎么與服務器或你好友所在的QQ進程通信
    的頭像 發表于 11-13 10:48 ?421次閱讀
    網絡<b class='flag-5'>中進程</b>之間如何通信

    Linux中進程、線程和協程的基礎概念

    進程是計算機中運行的程序的實例,它是操作系統中最基本的執行單元之一。每個進程都有自己的獨立內存空間、系統資源和代碼執行流。這意味著一個進程的崩潰通常不會影響其他
    的頭像 發表于 12-06 09:22 ?889次閱讀

    Python中多線程和多進程的區別

    Python作為一種高級編程語言,提供了多種并發編程的方式,其中多線程與多進程是最常見的兩種方式之一。在本文中,我們將探討Python中多線程與多進程的概念、區別以及如何使用線程池與
    的頭像 發表于 10-23 11:48 ?413次閱讀
    <b class='flag-5'>Python</b>中多線程和多<b class='flag-5'>進程</b>的區別
    主站蜘蛛池模板: 国产午夜精品视频在线播放| 亚洲精品无码AV中文字幕蜜桃| 一区二区视频在线观看高清视频在线| 黑人强伦姧人妻日韩那庞大的| 一级做a爰片久久毛片免费| 伦理在线影院伦理电影 | 免费完整版观看| 小学生偷拍妈妈视频遭性教育| 国内久久久久影院精品| 四川老师边上网课边被啪视频| 国产欧美国日产在线播放| 曰产无码久久久久久精品| 日本高清在线一区二区三区| 国产小视频在线高清播放| 97人人看碰人免费公开视频| 免费撕开胸罩吮胸视频| 高清国产激情视频在线观看| 搡女人免费免费视频观看| 激情办公室| youjizz怎么看| 亚洲日本激情| 九九精品久久| 成人免费观看国产高清| 秋霞电影网视频一区二区三区| GAY2022空少被体育生暴菊| 欧美激情一区二区三区视频| 国产精品无码久久久久不卡| 98国产精品人妻无码免费| 亚洲薄码区| 久久综合久久伊人| 国产精品美女WWW爽爽爽视频| 亚瑟天堂久久一区二区影院| 国产午夜不卡| FREE性丰满HD毛多多| 野花日本免费完整版高清版动漫 | 免费被靠视频动漫| 亚洲视频免费看| 久久嫩草影院网站| 国产1广场舞丰满老女偷| 同桌上课把奶露出来给我玩| 国产精品婷婷久青青原|