前言:本博文是對python併發程式設計之程序的知識延伸,主要講解:殭屍程序、孤兒程序。
python多程序中的multiprocessing
python多程序中的fork
python併發程式設計之程序(守護程序、鎖、訊號量)
四、知識擴充套件
在前面的博文裡,我們介紹到:正常情況下,子程序是通過父程序建立的,子程序在建立新的程序。子程序的結束和父程序的執行是乙個非同步過程,即父程序永遠無法**子程序到底什麼時候結束。 當乙個程序完成它的工作終止之後,它的父程序需要呼叫wait()
或者waitpid()
系統呼叫取得子程序的終止狀態。也就是說:父程序會預設等待子程序的執行,在所有子程序都結束之後,父程序再結束。
殭屍程序:主程序在建立子程序的時候,如果子程序退出,而父程序並沒有呼叫wait
或waitpid
獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中。這種程序稱之為僵死程序。
import time, sys
from multiprocessing import process, current_process
deffunc()
:print
('子程序pid'
, current_process(
).pid)
print
('子程序退出'
)def
main()
:print
('父程序pid'
, current_process(
).pid)
p = process(target=func)
p.start(
) time.sleep(10)
print
('父程序退出'
) sys.exit(
)# 退出程式
# p.join(timeout=1) # 如果**失敗,則不**
# timeout 父程序只會阻塞等待1秒常識**子程序。
孤兒程序:乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序。孤兒程序將被init
程序(程序號為1)所收養,並由init
程序對它們完成狀態收集工作。
from multiprocessing import process, current_process
import time, sys
deffunc()
:# 孤兒程序,父程序早於子程序退出
print
('子程序pid'
, current_process(
).pid)
time.sleep(10)
print
('子程序退出'
)def
main()
:print
('子程序pid'
, current_process(
).pid)
p = process(target=func)
p.start(
)print
('父程序退出'
) sys.exit(
)# 退出程式
# p.join(timeout=1) # 如果**失敗,則不**
# timeout 父程序只會阻塞等待1秒常識**子程序。
# 父程序早於子程序退出,此時子程序一直會被1號程序**,監控
deffunc()
: pid = os.fork(
)# fork()會執行分割成兩部分,呼叫一次,返回兩次,且在fork()在linux執行。
if pid ==0:
# 子程序pid為0
time.sleep(10)
print
('我是子程序'
)if pid >0:
# 父程序pid為子程序的pid
print
('我是父程序,我開啟的子程序pid是'
, pid)
if __name__ ==
'__main__'
: func(
)
在linux中,有這麼乙個機制:父程序無論什麼時候都可以獲取到子程序的的 一些資料。那麼當子程序任務執行完畢後,確實結束了,但是仍然保留一些資料,目的是為了讓父程序能夠獲取這些資訊。linux中可以呼叫wait
或waitpid
來徹底清除子程序的殘留資訊。
在python中已經封裝了處理殭屍程序的操作,所以我們無需關心。孤兒程序的話,因為它是沒有父程序的程序,那麼孤兒程序這個重任就落到了init
程序身上,它會處理做好一切善後工作,因此孤兒程序並不會有什麼危害。
Python併發程式設計之程序池
前言 本博文主要講解python併發程式設計中的程序池 pool python多程序中的multiprocessing python多程序中的fork python程序通訊之queue 當我們需要建立的子程序數量不多時,可以直接利用multiprocessing中的process動態成生多個程序,但...
併發程式設計之程序
在python中大部分情況需要使用多程序。python提供了multiprocessing。multiprocessing模組用來開啟子程序,並在子程序中執行我們定製的任務 比如函式 該模組與多執行緒模組threading的程式設計介面類似。multiprocessing模組的功能眾多 支援子程序 ...
python之路 併發程式設計之程序 IPC
ipc 程序間的通訊 兩種實現方式 管道 pipe 佇列 queue 其實就是pipe lock 注意 兩者實際上都是記憶體空間,不要往裡面放入大資料,只能放資料量較小的訊息 ipc所解決的問題 1.當多個任務併發的去修改共享資料,就可能會造成資料錯亂,我們通過加互斥鎖使多個任務對共享資料的操作由併...