多进程-开启子进程的两种方式,查看进程的pid与ppid,僵尸进程与孤儿进程
一、开启子进程的两种方式
方式一:
# 方式一:
from multiprocessing import Process
import time
def task(name):
print("%s is running" % (name))
time.sleep(3)
print("%s is done" % (name))
if __name__ == '__main__':
# p = Process(target=task, kwargs={"name": "子进程1"}) # 参数以字典形式传入,kwargs={"name": "子进程1"} ,target表示调用对象,即子进程要执行的任务。
p = Process(target=task, args=("子进程1",)) # 参数以元组形式传入,args=("子进程1",) 必须要有逗号,target表示调用对象,即子进程要执行的任务。
p.start() # 仅仅只是给操作系统发送了一个信号
print("主")
运行输出:
主 子进程1 is running 子进程1 is done
方式二:
# 方式二
from multiprocessing import Process
import time
class MyProcess(Process):
def __init__(self, name):
super().__init__()
self.name = name
def run(self): # 固定形式,名字必须是 run
print("%s is running" % (self.name))
time.sleep(3)
print("%s is done" % (self.name))
if __name__ == '__main__':
p = MyProcess("子进程1")
p.start() # 调用start 实际上就是调用run,一定要叫run 不能叫其他名字
print("主")
运行输出:
主 子进程1 is running 子进程1 is done
二、查看进程的pid与ppid
通过 os.getpid() 获取pid
通过 os.getppid() 获取父进程pid
from multiprocessing import Process
import time
import os
def task(name):
print("%s is running, pid is:%s, ppid is:%s" % (name, os.getpid(), os.getppid()))
time.sleep(3)
print("%s is done, pid is:%s, ppid is:%s" % (name, os.getpid(), os.getppid()))
if __name__ == '__main__':
p = Process(target=task, args=("子进程1",))
p.start()
print("主进程,pid is:%s, 主进程的ppid is:%s" % (os.getpid(), os.getppid()))
运行输出:
主进程,pid is:9156, 主进程的ppid is:15936 子进程1 is running, pid is:15512, ppid is:9156 子进程1 is done, pid is:15512, ppid is:9156
三、僵尸进程与孤儿进程
僵尸进程:
我们知道父进程可以开启多个子进程,父进程会等待所有子进程都运行结束,程序才会终止,假如其中一个子进程运行完了之后就释放了自身所用到的资源,那么父进程再想去看这个子进程的状态的时候就午饭看到了,所以在Linux或Unix中为我们提供了一种数据结构就叫僵尸进程,所以子进程都要经历僵尸进程的状态,所有子进程死掉后,不会立即被清理,可能会有部分资源会被释放,但是子进程状态依然会被保留,留着尸体即僵尸进程,以便父进程来看的时候可以知道子进程的状态情况,由父进程为子进程收尸,父进程终止时,这些僵尸进程才会跟着被销毁,有害处,假如父进程一直不死,则僵尸进程会一直存在,占用pid或其他系统资源,最终可能导致无法创建新的进程。
孤儿进程:
是指父进程死掉了,但是子进程依然存在的情况,此时子进程没有父进程来管理了,便成了孤儿进程,会由init来接管回收,Linux上init是所有进程的爹。
孤儿进程无害,会由init进行回收。
共有 0 条评论