併發程式設計(四) 程序方法

2022-05-17 02:23:29 字數 3552 閱讀 4431

*****

開啟了程序之後,就要學習一下對應的方法

本小節對程序的一些方法進行簡單的理解:

1.process的join方法

p.join([timeout]):主程序等待p終止(強調:是主程序處於等的狀態,而p是處於執行的狀態)

​ timeout是可選的超時時間

首先,系統在執行的過程中可能會出現這樣的情況:

1.主程序和子程序彼此獨立,在都完成執行之後,由系統進行統一**

2.主程序等子程序執行完畢之後再執行

第一種情況好說,第二種情況就需要有一種機制能夠讓主程序檢測子程序是否執行完畢

在子程序執行完畢後才繼續執行,否則一直在原地阻塞,這就是join方法的作用

from multiprocessing import process

def func(name, *args, **kwargs):

print(f'執行!')

pass

if __name__ == '__main__':

p = process(target=func, args=('子程序',))

p.start()

p.join()

print('我是主程序...')

在沒有利用join方法的時候,執行順序是這樣的

我是主程序...

子程序執行!

利用join之後,執行順序就變成

子程序執行!

我是主程序...

可以看到,主程序的**在等待子程序**執行結束才開始執行

那是變成序列了嗎???

import time

from multiprocessing import process

def func(name, times, *args, **kwargs):

time.sleep(times)

print(f'執行!')

pass

if __name__ == '__main__':

p1 = process(target=func, args=('子程序1', 1))

p2 = process(target=func, args=('子程序2', 2))

p3 = process(target=func, args=('子程序3', 3))

p1.start()

p2.start()

p3.start()

start_time = time.time()

p1.join()

p2.join()

p3.join()

print('我是主程序...')

如果將join理解成序列,那麼,子程式的執行時間應該是1+2+3 = 6s多

先執行p1,睡1s,再執行p2,睡2s,再執行p3,睡3s

那我們來看一下執行結果:

子程序1執行!

子程序2執行!

子程序3執行!

我是主程序...

時間是3s多,說明不是序列,依舊是併發執行

在開始介紹過,join是主程序等待子程序執行結束,再執行

p1 p2 p3 都是子程序,彼此不需要等待,是併發執行的狀態

所以子程序互相都是共享時間的,都是在執行的

而當子程序中3s的執行完了,也就意味著所有的子程序執行完畢了

才會執行主程序,所以子程序的執行時間只有3s多

上述的**也可以優化一下:

import time

from multiprocessing import process

def func(name, times, *args, **kwargs):

time.sleep(times)

print(f'執行!')

pass

if __name__ == '__main__':

p1 = process(target=func, args=('子程序1', 1))

p2 = process(target=func, args=('子程序2', 2))

p3 = process(target=func, args=('子程序3', 3))

ls = [p1, p2, p3]

for l in ls:

l.start()

start_time = time.time()

for l in ls:

l.join()

print('我是主程序...')

p.terminate():強制終止程序p,不會進行任何清理操作,如果p建立了子程序,該子程序就成了殭屍程序,使用該方 法需要特別小心這種情況。如果p還儲存了乙個鎖那麼也將不會被釋放,進而導致死鎖

p.is_alive():如果p仍然執行,返回true

import time

from multiprocessing import process

def func(name, *args, **kwargs):

print(f'執行!')

pass

if __name__ == '__main__':

p = process(target=func, args=('子程式',))

p.start()

p.terminate()

print(p.is_alive())

time.sleep(1)

print(p.is_alive())

true

false

需要強調的一點就是terminate()會終止程序,但是不是立馬就會將其**

所以緊接著is_alive()也可能會返回true

隔一段時間再看,就返回的是false

這裡提到了乙個名詞:殭屍程序,其實還有個孤兒程序

殭屍程序:

主程序還沒結束的時候退出的子程序就是殭屍程序

任何乙個子程序在結束之後並不會馬上消失掉,而是要留下乙個稱為殭屍程序的資料結構,等待父程序處理

這是每個子程序在結束時都要經過的階段,如果子程序在結束之後,父程序沒有來得及處理

那麼保留的那段資訊就不會釋放,其程序號就會一直被占用,但是系統所能使用的程序號是有限的

如果大量的產生殭屍程序,將因為沒有可用的程序號而導致系統不能產生新的程序,應當避免

孤兒程序:

乙個父程序退出,而它的乙個或多個子程序還在執行,那麼那些子程序將成為孤兒程序

孤兒程序將被init程序所收養,並由init程序對它們完成狀態收集工作

孤兒程序是沒有父程序的程序,孤兒程序這個重任就落到了init程序身上

init程序就好像是乙個民政局,專門負責處理孤兒程序的善後工作

每當出現乙個孤兒程序的時候,核心就把孤兒程序的父程序設定為ini

這樣,當乙個孤兒程序淒涼地結束了其生命週期的時候

init程序就會代表黨和**出面處理它的一切善後工作,因此孤兒程序並不會有什麼危害

*****

*****

python併發程式設計 程序,併發

1.程序是乙個正在執行的程式,或者說是程式執行的過程,程序是個抽象概念 程序起源於作業系統,是作業系統最核心的概念,作業系統所有其他的概念都是圍繞程序展開 研究程序最底層就是在研究作業系統底層 2.序列 程序 乙個任務完完整整的執行完畢後,在執行下乙個任務 3.併發 程序 看起來多個任務是同時執行即...

併發程式設計(四)

在併發佇列上jdk提供了兩套實現,乙個是以concurrentlinkedqueue為代表的高效能佇列,乙個是以blockingqueue介面為代表的阻塞佇列,無論哪種都繼承自queue。1 concurrentlinkedqueue 是乙個適用於高併發場景下的佇列,通過無鎖的方式,實現了高併發狀態...

併發程式設計 四

是指乙個執行緒a呼叫了物件o的wait 方法進入等待狀態,而另乙個執行緒b呼叫了物件o的notify 或者notifyall 方法,執行緒a收到通知後從物件o的wait 方法返回,進而執行後續操作。上述兩個執行緒通過物件o來完成互動,而物件上的wait 和notify notifyall 的關係就如...