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