一、进程常用方法
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()