讓我們由淺到深----------深刻了解python中進程創建、使用、管理等等。。。。。。
**
什么是進程?
**
1、在早期面向過程設計的計算機結構中,過程是程序的基本執行實體;在當代面向線程設計的計算機體系結構中,進程是線程的容器。它是對指令、數據及其組織形式的描述,過程是程序的實體。多通道程序在執行時需要共享系統資源,這就導致了各個程序在執行過程中相互制約,程序的執行呈現出不連續性的特點。
2、進程是關于數據集的獨立程序的運行活動。它可以申請并擁有系統資源,這是一個動態概念和活動實體。它不僅是程序的代碼,也是當前活動,由程序計數器的值和處理寄存器的內容表示。
3、進程是操作系統中最基本、最重要的概念。它是多道程序設計系統出現后引入的一個概念,用來描述系統內部的動態情況,描述系統內部各個程序的活動規律。所有多道程序設計操作系統都基于該過程。過程的本質是多通道程序系統中程序的執行過程。該過程是動態生成的,并動態終止。
看到上面的進程解釋是不是非常的暈,事實上我看著也很暈,下面我們就來了解什么是進程吧。
在我看來進程是計算機中的程序關于某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎,進程是程序的實體。進程就是程序。
下面讓我們用例子來說明一下什么是進程及python中進程如何使用的
**
進程例子,了解進程創建和分配
**
# TODO 導入進程的包 import multiprocessing # 進程包 import time # 1.work1 def work(): for i in range(5): print("work正在工作中.....") time.sleep(0.2) # 2.work2 def work2(): for i in range(5): print("work2正在工作中......") time.sleep(0.2) if __name__=="__main__": # TODO 主進程 # TODO 兩個子進程 work_process=multiprocessing.Process(target=work,name="work1Process") work2_process=multiprocessing.Process(target=work2) # 啟動子進程任務 work_process.start() work2_process.start()
運行結果:
work正在工作中..... work2正在工作中...... work2正在工作中......work正在工作中..... work正在工作中..... work2正在工作中...... work2正在工作中...... work正在工作中..... work2正在工作中...... work正在工作中.....
運行結果:
work2正在工作中...... work正在工作中..... work正在工作中.....work2正在工作中...... work2正在工作中......work正在工作中..... work2正在工作中......work正在工作中..... work正在工作中.....work2正在工作中......
你多次運行會發現每次的運行結果基本上都不相同,是不是很奇怪,那是因為進程是隨機分配的,毫無規律可言。
進程有主進程和子進程。例如一個程序中的主函數是最先執行的,調度和分配函數,那么主進程就是主函數**if __name__=="__main__":,子進程就是被調度(調用)的函數work():和work2()**,主線程起到控制子線程的作用。
想要更好的了解代碼就要了解進程代碼中各個元素的含義,下面讓我們來一起看一下。
work_process=multiprocessing.Process(target=work,name="work1Process") work2_process=multiprocessing.Process(target=work2)
這兩行代碼,兩行都是主函數(主進程)分配兩個子進程(被調用的函數)****【也可以成為程序中除主函數的其他函數】,target是進程執行的目標函數,也就是這個進程分配的對象,name是進程的名字(不寫就默認),可寫可不寫,不過方便后面查看進程的名字我們將第一個子進程起一個名字。
work_process.start()
start 開啟進程,work_process是前面創建(分配)進程的名字,work_process.start()即為開啟創建的work_process進程。
**
獲取進程編號
**
multiprocessing.current_process() 獲取當前進程的名字(name)
os.getppid() 獲取父進程
注意:使用os.getppid()要先引入os包(import os),os包一般用于對文件的處理。
import os # 一般用于文件處理 import multiprocessing # 進程包 import time # 1.work1 def work(): print("當前work:",os.getpid()) # TODO 當前的進程名 print("work:",multiprocessing.current_process()) # TODO 獲取父進程 print("work的父進程是:",os.getppid()) for i in range(5): print("work正在工作中.....") time.sleep(0.2) # 2.work2 def work2(): for i in range(5): # TODO 當前的進程名 print("work2:", multiprocessing.current_process()) # TODO 獲取父進程 print("work2的父進程是:", os.getppid()) print("當前work2:", os.getpid()) print("work2正在工作中......") time.sleep(0.2) if __name__=="__main__": # TODO 主進程 print("main:",os.getpid()) # TODO 兩個子進程 work_process=multiprocessing.Process(target=work,name="work1Process") work2_process=multiprocessing.Process(target=work2) # 啟動子進程任務 work_process.start() work2_process.start() multiprocessing.Process()
運行結果:;
main: 12700 當前work:work2: 31648 work:
我們可以清晰地發現進程的名字和當前進程的父進程。****work1Process和Process-2,**前者是我們自己起的名字,如果沒有起會默認為Process-1。進程一旦分配除非遇到內存限制,資源不夠等特殊情況(程序不能繼續執行下去),進程會一直運行下去且進程名不變。也就是說進程名會和我們的名字一樣,出生到死亡一輩子都是這個名字,中途改名對應的就是計算機所發生的特殊情況(內存不夠、程序出錯等原因)
**
進程執行帶有參數的任務
**
進程執行傳參操作,字典、元組等,為后面大型項目做鋪墊,可能現在的項目單個進程和多個進程還沒有很好的體現,但是后面隨著項目規模的變大,你會很好的發現單進程和多進程的區別。所以了解進程十分重要
元組傳參,
import os # 一般用于文件處理 import multiprocessing # 進程包 import time # 1.work1 def work(count,number): print("當前work:",os.getpid()) # TODO 當前的進程名 print("work:",multiprocessing.current_process()) # TODO 獲取父進程 print("work的父進程是:",os.getppid()) for i in range(5): print("work正在工作中.....") time.sleep(0.2) ## 2.work2 # def work2(count,number): # for i in range(5): # # TODO 當前的進程名 # print("work2:", multiprocessing.current_process()) # # TODO 獲取父進程 # print("work2的父進程是:", os.getppid()) # print("當前work2:", os.getpid()) # print("work2正在工作中......") # time.sleep(0.2) if __name__=="__main__": # TODO 主進程 print("main:",os.getpid()) # TODO 兩個子進程 work_process=multiprocessing.Process(target=work,args=(5,10)) # work2_process=multiprocessing.Process(target=work2,kwargs={"count":5,"number":10}) # 啟動子進程任務 work_process.start() # work2_process.start() multiprocessing.Process()
運行結果:
main: 11896 當前work: 23728 work:
元組傳參就是主進程將數據以元組的方式傳遞給子進程,類似于python中調用一個函數,通過元組的方式傳參。不太理解的可以去了解一下Python的傳參過程,很重要,想要掌握python就必須要掌握它。
元組格式 (1,5,3)、(“小紅”,“小花”,“18”)、(2,)
注意:一個元素是要加一個逗號
python中的元素交換
a,b=b,a
這樣就可以交換a,b的值
字典傳參
import os # 一般用于文件處理 import multiprocessing # 進程包 import time # 1.work1 # def work(count,number): # print("當前work:",os.getpid()) # # TODO 當前的進程名 # print("work:",multiprocessing.current_process()) # # # TODO 獲取父進程 # print("work的父進程是:",os.getppid()) # for i in range(5): # print("work正在工作中.....") # time.sleep(0.2) # 2.work2 def work2(count,number): for i in range(5): # TODO 當前的進程名 print("work2:", multiprocessing.current_process()) # TODO 獲取父進程 print("work2的父進程是:", os.getppid()) print("當前work2:", os.getpid()) print("work2正在工作中......") time.sleep(0.2) if __name__=="__main__": # TODO 主進程 print("main:",os.getpid()) # TODO 兩個子進程 # work_process=multiprocessing.Process(target=work,args=(5,10)) work2_process=multiprocessing.Process(target=work2,kwargs={"count":5,"number":10}) # 啟動子進程任務 # work_process.start() work2_process.start()
time.sleep(0.2) 休息0.2s,如果不休息0.2s你會發現太順暢,結果一下子就出來了,休息0.2s可以更好地看清楚進程運行
運行結果:
main: 18372 work2:
字典傳參就是主進程將數據以字典的方式傳遞給子進程,類似于python中調用一個函數,通過字典的方式傳參。不太理解的可以去了解一下Python的傳參過程,很重要,想要掌握python就必須要掌握它。 **字典和元組都是python常見的兩種格式,其中字典是以鍵對值存在的,就是一把藥匙一個門,鍵就是藥匙,值就是門,可能一把藥匙可以開n個門,但是一個門不可能同時存在多個藥匙。也就是說,鍵不可以重復,是唯一的,但是值可以重復。所以通常可以通過鍵去提取值。**上文提點傳參就是將數據以字典的形式傳出去。
只要是進程你反復運行結果都是不一樣的,因為進程是系統隨機分配的,基本上不可能重復,如果你反復運行是重復的,恭喜你,你可以買彩票了,別忘了叫上我。
注意:
守護主進程
deamo = True
子進程銷毀
terminate
退出進程
exit()
常用屬性
name:當前進程起別名,默認為Process-1,依次遞增
實例方法:
start()
啟動子進程實例(創建子進程)
join()
等待子進程執行結束
terminate()
不管任務是否執行完畢,立即終止子進程.
希望這篇文章對大家有所幫助
Python 任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。