生活随笔
收集整理的這篇文章主要介紹了
进程比较基础的内容
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 1.創建多進程的兩種方式
- 2.孤兒進程和僵尸進程
- 3.pid,一個進程的身份證
- 4.Process的join方法
- 5.Process的name和is_alive方法
- 6.Process的terminal
- 7.守護進程
1.創建多進程的兩種方式
1.1 方式一(函數)
# 方式一
from multiprocessing import Process
import timedef test(name):print(f"{name}的子進程開始...")time.sleep(3)print("子進程結束...")
if __name__ == '__main__':p = Process(target=test,args=("xc",)) # 要用元組哦p.start()# time.sleep(3)print("主進程")
1.2 方式二(類)
# 方式二
from multiprocessing import Process
import timeclass My(Process):def __init__(self,name):super().__init__()self.name = namedef run(self):print(f"{self.name}的子進程開始...")time.sleep(3)print("子進程結束...")
if __name__ == '__main__':p = My('xc')p.start()print("xc的主進程")
2.孤兒進程和僵尸進程
- 孤兒進程:其實就是主繼承執行完了,子進程還沒執行完,因為會變成僵尸進程,以及占用pid號,所以就會被init方法回收
- 僵尸進程:其實就是子進程運行完了之后,他不是真正的運行完,而是會保留一些信息,其中pid是最主要的信息,僵尸進程,會在主程序執行完了之后被自動回收
3.pid,一個進程的身份證
from multiprocessing import Process
import time
import osclass My(Process):def __init__(self,name):super().__init__()self.name = namedef run(self):print(f"{self.name}的子進程開始...")print(self.pid)print(os.getpid())print(os.getppid())time.sleep(3)print("子進程結束...")
if __name__ == '__main__':p = My('xc')print(os.getpid())p.start()print("xc的主進程")"""
打印結果:11200xc的主進程xc的子進程開始...6664666411200子進程結束...
"""
- 通過以上數據我們了解了使用os模塊的getpid和getppid方法獲取進程的pid序號,其中getpid是獲取當前進程的pid,而ppid是獲取父進程的pid
- 當然查看pid的方法不止這一個
4.Process的join方法
- 等待子進程運行完,在執行主進程的代碼,阻塞主程序的運行
from multiprocessing import Process
import time
def foo():print("程序開始...")time.sleep(3)print("程序結束...")if __name__ == '__main__':p = Process(target=foo)p1 = Process(target=foo)p2 = Process(target=foo)start = time.time()p.start()p1.start()p2.start()p.join() # 會阻塞主程序的運行p1.join()p2.join()end = time.time()print("主程序結束...")print(start-end)
# 打印結果:# 程序開始...# 程序結束...# 程序開始...# 程序開始...# 程序結束...# 程序結束...# 主程序結束...# -3.150564193725586
# 如果表示形式為以上的AAABBB形式,那么所需的時間為3s以上,說明這種寫法是主程序等待所有都在運行的子程序執行完###################################################################################################from multiprocessing import Process
import time
def foo():print("程序開始...")time.sleep(3)print("程序結束...")if __name__ == '__main__':p = Process(target=foo)p1 = Process(target=foo)p2 = Process(target=foo)start = time.time()p.start()p.join() # 會阻塞主程序的運行p1.start()p1.join()p2.start()p2.join()print("主程序結束...")end = time.time()print(start-end)
# 打印結果:# 程序開始...# 程序結束...# 程序開始...# 程序結束...# 程序開始...# 程序結束...# 主程序結束...# -9.349010705947876
# 根據上面的內容來看,如果按照ABABAB執行,就會出現子程序等其他子程序執行完再執行,就會疊加時間,就是一個串行的進程了
5.Process的name和is_alive方法
- name:查看子進程的名字(類似于這樣的名字,Process-1)
- is_alive:返回值為布爾類型,判斷子進程是否結束,需要一定的結束時間,所以使用time模塊等一會兒,或者使用join方法等待結束,如果還沒結束就返回True,結束了就返回False
from multiprocessing import Process
import timedef foo():print("進程開始...")time.sleep(3)print("進程結束...")if __name__ == '__main__':p = Process(target=foo)# print(p.is_alive())p.start()print(p.name)print(p.is_alive())time.sleep(5)print("主程序結束...")print(p.is_alive())# 自己試驗下,情況就是name這個屬性對應著創建線程的一個代號,它是往下迭代的例如:Process-1,Process-2這樣迭代# 關于is_alive則是表示子程序有沒有結束,主要是看子程序有沒有運行完,可以使用time模塊測試
6.Process的terminal
- 強制結束子進程(類似于start,是給操作系統信號,并不是直接結束)
from multiprocessing import Process
import timedef foo():print("進程開始...")time.sleep(3)print("進程結束...")if __name__ == '__main__':p = Process(target=foo)p.start()print(p.is_alive())p.terminate() # 強制結束子進程p.join() # 我們必須在這里使用join,等待進程結束,那就有人問了,你等他結束了is_alive肯定是Flase呀,但是我們的注意點是子程序沒有打印數據print(p.is_alive())print("主進程結束...")# 對于Process中的terminate的使用也和start一樣,他只是去給操作系統發送了關閉子進程的信號,并不是直接結束
7.守護進程
- 忠心耿耿的進程,通過 對象名.daemon = True 的方法定義一個守護進程.
from multiprocessing import Process
import time
"""
守護進程
守護 --> 伴隨
本質上也是一個子進程
主進程的代碼執行完畢守護進程直接結束,但是此時主進程可能沒有結束
"""
def foo():print("守護進程開始...")time.sleep(3)print("守護進程結束...")if __name__ == '__main__':p = Process(target=foo)p.daemon = True # 這個就是把創建的子進程定義為守護進程,默認值應該是Flasep.start()# p.join()time.sleep(2)print("主進程結束...") # 也就是說主進程結束了,子進程就自動釋放了,就是不會運行了# 總結就是daemon這個方法把創建的子進程定義為守護進程,所謂的守護進程就是:主進程結束了,子進程也就是守護進程結束了
# 如果主進程沒結束,子進程也就是守護進程便會像普通進程一樣從有到無,從出現到離開
# 普通的子進程是不會管主進程的死活的,大不了變成孤兒進程繼續運行,反正會有init方法回收
轉載于:https://www.cnblogs.com/xiongchao0823/p/11515090.html
總結
以上是生活随笔為你收集整理的进程比较基础的内容的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。