进程创建--标准库multiprocessing模块(一--Process)
https://docs.python.org/zh-cn/3/library/multiprocessing.html#module-multiprocessing
multiprocessing
--- 基于进程的并行
1、multiprocessing 模块创建进程概述
【1】需要将要做的事情封装成函数
【2】使用multiprocessing提供的类Process创建进程对象
【3】通过进程对象和Process初始化进程进行进程的设置,绑定函数
【4】启动进程,会自动执行绑定的函数
【5】完成进程的回收
2、multiprocessing创建的进程的特点
【1】使用multiprocessing创建进程子进程同样复制父进程的全部内存空间,之后有自己独立的空间,执行上互不干扰
【2】子进程也是有自己特有的PID等资源
【3】如果不使用join回收可能会产生僵尸进程
【4】使用multiprocessing创建子进程,一般父进程功能就是创建子进程回收子进程,所有事件交给子进程完成
3、进程创建
from multiprocessing import Process
Process()方法
p=Process(target=None, name=None, args=(), kwargs={})
功能: 创建进程对象
参数: target,要绑定的函数的名称
name,给进程起的名称 (默认Process-1)
args,元组, 用来给target函数位置传参
kwargs,字典, 用来给target函数键值传参
4、启动进程
p.start()
功能 : 启动进程,自动运行terget绑定函数。此时进程被创建
5、阻塞等待子进程退出
p.join([timeout])
功能: 阻塞等待子进程退出
参数: 超时时间
6、process进程对象的其它属性
【1】p.name
可以获取进程名称
【2】p.pid
创建的新的进程的PID号
【3】p.is_alive()
判断进程是否处于alive状态
【4】p.daemon
默认为False, 如果设置为True ,则主进程退出时子进程也会结束
① daemon 属性设置要在start() 前
② 设置daemon为True, 则一般不需要加join
【mulProc-exa.py】
from multiprocessing import Process
from time import sleep
import os
def th1():
sleep(3)
print("吃饭")
print(os.getpid(),'---',os.getppid())
def th2():
sleep(4)
print("睡觉")
print(os.getpid(),'---',os.getppid())
def th3():
sleep(2)
print("打豆豆")
print(os.getpid(),'---',os.getppid())
things = [th1,th2,th3]
process = []
for th in things:
p = Process(target = th)
process.append(p) #保存进程对象
p.start()
#回收进程
for i in process:
i.join()
#结果
打豆豆
4762 --- 4759
吃饭
4760 --- 4759
睡觉
4761 --- 4759
【mulProc-name-alive.py】
from multiprocessing import Process
from time import sleep
def worker(sec,name):
for i in range(3):
sleep(sec)
print("I'm %s"%name)
print("I'm working...")
p = Process(target = worker,name = "Worker",\
args = (2,),kwargs = {'name':'Alex'})
p.start()
print(p.name)
print("Child PID:",p.pid) # p进程的进程号
print("is alive? ",p.is_alive()) #判断进程状态
p.join()
print("is alive? ",p.is_alive())
#结果
Worker
Child PID: 4800
is alive? True
I'm Alex
I'm working...
I'm Alex
I'm working...
I'm Alex
I'm working...
is alive? False
【mulPro-daemon.py】
from multiprocessing import Process
from time import sleep,ctime
def tm1():
while True:
sleep(2)
print(ctime())
p = Process(target = tm1)
p.daemon = True
p.start()
print("main process over")
#结果,加p.daemon=True,主程序结束,子进程不会执行
main process over