python 進(jìn)程的理解(主進(jìn)程和子進(jìn)程)

之前一直沒(méi)有時(shí)間梳理關(guān)于主進(jìn)程和子進(jìn)程的區(qū)別和聯(lián)系,今天好在有空,來(lái)粗淺的談?wù)劊鬟M(jìn)程和子進(jìn)程的關(guān)系。

from  multiprocessing import Process
import os

# 子進(jìn)程
def process_():
    while True:
        print('hello')
        print(os.getpid(), '這是子進(jìn)程。。。')

if __name__ == '__main__':
    p = Process(target=process_)
    p.start()
    # p.join()#這個(gè)是等子進(jìn)程全部運(yùn)行完再運(yùn)行主進(jìn)程
    print('這是主進(jìn)程。。。')
#運(yùn)行結(jié)果如下:
這是主進(jìn)程。。。
hello
46028 這是子進(jìn)程。。。
hello
46028 這是子進(jìn)程。。。
hello
46028 這是子進(jìn)程。。。
。。。。

我們來(lái)看看運(yùn)行結(jié)果,首先打印的是''這是主進(jìn)程。。。'',這想必大家都清楚為什么,在沒(méi)有p.join() 的時(shí)候會(huì)先運(yùn)行主進(jìn)程,后面的結(jié)果 ''hello
46028 這是子進(jìn)程。。。'' 這個(gè)可以看到在主進(jìn)程運(yùn)行完以后,才去運(yùn)行子進(jìn)程,進(jìn)入while Ture,不間斷輸出 “hello 46028 這是子進(jìn)程。。。” 下面我們將p.join()這個(gè)注釋打開(kāi)看看運(yùn)行結(jié)果。

from  multiprocessing import Process
import os


# 子進(jìn)程
def process_():
    while True:
        print('hello')
        print(os.getpid(), '這是子進(jìn)程。。。')


if __name__ == '__main__':
    p = Process(target=process_)
    p.start()
    p.join()#這個(gè)是等子進(jìn)程全部運(yùn)行完再運(yùn)行主進(jìn)程
    print('這是主進(jìn)程。。。')
#運(yùn)行結(jié)果如下:
hello
8524 這是子進(jìn)程。。。
hello
8524 這是子進(jìn)程。。。
hello
8524 這是子進(jìn)程。。。
hello
8524 這是子進(jìn)程。。。
hello
8524 這是子進(jìn)程。。。

分析結(jié)果加上p.join()的時(shí)候,直接先運(yùn)行的子進(jìn)程里面的內(nèi)容,而子進(jìn)程里面又是死循環(huán),所以'這是主進(jìn)程。。。' 這句話不會(huì)打印出來(lái)。下面會(huì)改變代碼觀察主進(jìn)程,子進(jìn)程相互切換運(yùn)行的情況。

from  multiprocessing import Process
import os
import time

# 子進(jìn)程
def process_():
    while True:
        print('hello')
        print(os.getpid(), '這是子進(jìn)程。。。')

if __name__ == '__main__':
    p = Process(target=process_)
    p.start()
    while True:
        print('這是主進(jìn)程。。。')
        time.sleep(1)
#運(yùn)行結(jié)果如下:
這是主進(jìn)程。。。
hello
45028 這是子進(jìn)程。。。
hello
45028 這是子進(jìn)程。。。
hello
45028 這是子進(jìn)程。。。

看看結(jié)果,有一個(gè)很奇怪的現(xiàn)象,在主進(jìn)程進(jìn)入while Ture 以后,打印一次 '這是主進(jìn)程。。。' 以后就跳進(jìn)了子進(jìn)程,進(jìn)入子進(jìn)程以后就一直不停循環(huán),直到棧溢出,為什么會(huì)出現(xiàn)這個(gè)情況呢?我們觀察一下 問(wèn)題出在 time.sleep(1) 這個(gè)函數(shù)上面,time.sleep()函數(shù)會(huì)將當(dāng)前進(jìn)程掛起,(掛起時(shí)間取決于time.sleep(X) 這個(gè)X是多少就會(huì)掛起多少秒,)掛起后的主進(jìn)程暫停運(yùn)行,此時(shí)子進(jìn)程會(huì)搶占資源去執(zhí)行子進(jìn)程,所以造成了這種奇怪的現(xiàn)象。為了更好地說(shuō)明情況,下面我們?cè)谧舆M(jìn)程里面也加上time.sleep()
下面看看效果:

from  multiprocessing import Process
import os
import time

# 子進(jìn)程
def process_():
    while True:
        print('hello')
        print(os.getpid(), '這是子進(jìn)程。。。')
        time.sleep(1)
        
if __name__ == '__main__':
    p = Process(target=process_)
    p.start()
    while True:
        print('這是主進(jìn)程。。。')
        time.sleep(1)
#運(yùn)行結(jié)果:
這是主進(jìn)程。。。
hello
48724 這是子進(jìn)程。。。
這是主進(jìn)程。。。
hello
48724 這是子進(jìn)程。。。
這是主進(jìn)程。。。
hello
48724 這是子進(jìn)程。。。

來(lái)看看這個(gè)運(yùn)行結(jié)果,就一下,說(shuō)明了情況,當(dāng)子進(jìn)程里面也加入time.sleep(1)以后,進(jìn)入子進(jìn)程以后,遇到time.sleep(1)子進(jìn)程臨時(shí)掛起,然后主進(jìn)程搶占資源,繼續(xù)打印'這是主進(jìn)程。。。'然后再遇到time.sleep(1)切換到子進(jìn)程,如此循環(huán)往復(fù),
好啦!關(guān)于join(),主進(jìn)程,子進(jìn)程,的粗淺理解,希望對(duì)看文章的你有一點(diǎn)幫助。如有疑問(wèn)歡迎私信哦!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容