首页 » 编程 » Python-7.并发编程 » 正文

多进程-开启子进程的两种方式,查看进程的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进行回收。

 

 

 

发表评论

*