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