【python】进程常用方法和多进程类的写法

本文介绍了Python中进程的daemon模式、join()方法用于同步主进程与子进程,以及is_alive()方法检查子进程状态。还展示了如何使用多进程类的继承和run方法实现自定义任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、进程常用方法

daemon 守护进程

  • 当进程参数daemon为True时,子进程会随着主进程的结束而结束,主进程结束会强制结束子进程
  • daemon默认为False,需要手动开启

import os
import time
from multiprocessing import Process, Queue


def work01(q: Queue):
    print("work01开始工作,队列id{}".format(id(q)))
    while not q.empty():
        print("从q中获取{}".format(q.get()))


def work02(q: Queue):
    print("work02开始工作,队列id{}".format(id(q)))
    while not q.empty():
        print("从q中获取{}".format(q.get()))


if __name__ == '__main__':
    q = Queue()
    q.put('a')
    q.put('b')
    q.put('c')

    p1 = Process(target=work01, args=(q,))
    p2 = Process(target=work02, args=(q,))
    p1.daemon = True  #子进程p1开启daemon
    p2.daemon = True  #子进程p2开启daemon
    p1.start()
    p2.start()
    print("主进程运行结束。")
    
    OUTPUT:主进程运行结束。

join()方法 阻塞进程

  • 一般主进程跟子进程是异步的,主进程结束后子进程还会继续运行
  • 怎么才能保证让主进程最后再结束呢? 用join方法去阻塞
  • 以下代码运行, print("主进程运行结束。") 会在两个子进程结束运行后才输出
import os
import time
from multiprocessing import Process, Queue


def music(q: Queue):
    print("music进程id{}".format(os.getpid()))
    for i in range(500):
        print("playing music...")


def dance(q: Queue):
    print("dance进程id{}".format(os.getpid()))
    for i in range(500):
        print("dancing...")


if __name__ == '__main__':
    print("主进程id{}".format(os.getpid()))
    q = Queue()

    p1 = Process(target=music, args=(q,))
    p2 = Process(target=dance, args=(q,))
    p1.daemon = True  # p1子进程daemon开启
    p2.daemon = True  # p2子进程daemon开启
    p1.start()
    p2.start()
    p1.join()  # 上面的代码任务没有执行完,不会运行下面的代码 == 阻塞作用
    p2.join()  # 上面的代码任务没有执行完,不会运行下面的代码 == 阻塞作用
    print("主进程运行结束。")

 

is_alive()方法 判断子进程是否存活

  • 主进程和子进程是并发运行的

from multiprocessing import Process, Queue
import time


def run() -> None:
    print("子进程启动")
    time.sleep(5)
    print("子进程结束")


if __name__ == '__main__':
    p = Process(target=run)
    p.start()
    time.sleep(1)
    p.terminate()

    print("is_alive:{}".format(p.is_alive()))
    time.sleep(0.01)
    print("is_alive:{}".format(p.is_alive()))
    
output:
子进程启动
is_alive:True
is_alive:False

terminal()方法 结束子进程

  • 参考is_alive()方法中的代码示例

二、多进程类的写法

from multiprocessing import Process

#继承Process类
class MyProcess(Process):
    def __init__(self):
        super().__init__()

    def run(self):
        print("hello ")


if __name__ == '__main__':
    p1 = MyProcess()
    p2 = MyProcess()
    p1.start()  # 会调用 MyProcess中的run方法
    p2.start()

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值