python僵尸进程和孤儿进程_python中多进程应用及僵尸进程、孤儿进程
一、python如何使用多進(jìn)程
創(chuàng)建子進(jìn)程的方式
1.導(dǎo)入multiprocessing 中的Process類 實(shí)例化這個(gè)類 指定要執(zhí)行的任務(wù) target
import os
from multiprocessing import Process
"""
Process 就表示進(jìn)程
為什么要開(kāi)進(jìn)程
"""
def task():
print("this is sub process")
print("sub process id %s" % os.getpid())
if __name__ == '__main__':
# ######注意 開(kāi)啟進(jìn)程的代碼必須放在 ————main————判斷下面
# 實(shí)例化一個(gè)進(jìn)程對(duì)象 并制定他要做的事情 用函數(shù)來(lái)指定
p = Process(target=task)
p.start() # 給操作系統(tǒng)發(fā)送消息 讓它開(kāi)啟進(jìn)程
print("this is parent process")
print("parent process is: %s" % os.getpid())
print("over")
linux 與windows開(kāi)啟進(jìn)程的方式不同
linux 會(huì)將父進(jìn)程的內(nèi)存數(shù)據(jù) 完整copy一份給子進(jìn)程
注意:
? windows 會(huì)導(dǎo)入父進(jìn)程的代碼 從頭執(zhí)行一遍 來(lái)獲取需要處理的任務(wù)
? 所以在編寫(xiě)代碼時(shí)如果是windows一定要將開(kāi)啟進(jìn)程的代碼放main判斷中
? linux 可以不放
2.導(dǎo)入multiprocessing 中的Process類 繼承這個(gè)類 覆蓋run方法 將要執(zhí)行的任務(wù)放入run中開(kāi)啟進(jìn)程時(shí)會(huì)自動(dòng)執(zhí)行該函數(shù)
from multiprocessing import Process
import os
class Downloader(Process):
# def __init__(self,url,size,name):
# super().__init__()
# self.url = url
# self.size = size
# self.name = name
def run(self):
print(os.getpid())
pass
if __name__ == '__main__':
m = Downloader()
m.start()
print("parent over",os.getpid())
如果需要對(duì)進(jìn)程對(duì)象進(jìn)行高度自定義那就可以繼承它
進(jìn)程之間內(nèi)存相互隔離
from multiprocessing import Process
import os,time
a = 257
def task():
global a
# print("2",a,id(a))
a = 200
if __name__ == '__main__':
p = Process(target=task)
p.start() # 向操作系統(tǒng)發(fā)送指令
time.sleep(4)
print(a)
join函數(shù)
from multiprocessing import Process
import time
def task1(name):
for i in range(10000):
print("%s run" % name)
def task2(name):
for i in range(100):
print("%s run" % name)
if __name__ == '__main__': # args 是給子進(jìn)程傳遞的參數(shù) 必須是元組
p1 = Process(target=task1,args=("p1",))
p1.start() # 向操作系統(tǒng)發(fā)送指令
# p1.join() # 讓主進(jìn)程 等待子進(jìn)程執(zhí)行完畢在繼續(xù)執(zhí)行
p2 = Process(target=task2,args=("p2",))
p2.start() # 向操作系統(tǒng)發(fā)送指令
p2.join() # 讓主進(jìn)程 等待子進(jìn)程執(zhí)行完畢在繼續(xù)執(zhí)行
p1.join()
#需要達(dá)到的效果是 必須保證兩個(gè)子進(jìn)程是并發(fā)執(zhí)行的 并且 over一定是在所有任務(wù)執(zhí)行完畢后執(zhí)行
print("over")
案例:
# join的使用
from multiprocessing import Process
import time
def task1(name):
for i in range(10):
print("%s run" % name)
if __name__ == '__main__': # args 是給子進(jìn)程傳遞的參數(shù) 必須是元組
ps = []
for i in range(10):
p = Process(target=task1,args=(i,))
p.start()
ps.append(p)
# 挨個(gè)join以下
for i in ps:
i.join()
print("over")
二、僵尸進(jìn)程與孤兒進(jìn)程
孤兒進(jìn)程 當(dāng)父進(jìn)程已經(jīng)結(jié)束 而子進(jìn)程還在運(yùn)行 子進(jìn)程就稱為孤兒進(jìn)程 尤其存在的必要性,沒(méi)有不良影響
僵尸進(jìn)程 當(dāng)一個(gè)進(jìn)程已經(jīng)結(jié)束了但是,它仍然還有一些數(shù)據(jù)存在 此時(shí)稱之為僵尸進(jìn)程
在linux中,有這么一個(gè)機(jī)制,父進(jìn)程無(wú)論什么時(shí)候都可以獲取到子進(jìn)程的的 一些數(shù)據(jù)
子進(jìn)程 任務(wù)執(zhí)行完畢后,確實(shí)結(jié)束了但是仍然保留一些數(shù)據(jù) 目的是為了讓父進(jìn)程能夠獲取這些信息
linux中 可以調(diào)用waitpid來(lái)是徹底清除子進(jìn)程的殘留信息
python中 已經(jīng)封裝了處理僵尸進(jìn)程的操作 ,無(wú)需關(guān)心
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的python僵尸进程和孤儿进程_python中多进程应用及僵尸进程、孤儿进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python 2x可以打么_15分钟让你
- 下一篇: websocket python爬虫_p