multiprocessing模块-Process
multiprocessing模块-Process
# multiple 多元化的
# processing 进程
# multiprocessing 多元的处理进程的模块
仔细说来,multiprocess不是一个模块而是python中一个操作、管理进程的包。 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块。由于提供的子模块非常多,为了方便大家归类记忆,我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。
Process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。
import os
from multiprocessing import Process
def func():
print(os.getpid(),os.getppid())
# # pid process id 进程id
# # ppid parent process id 父进程id
if __name__ == '__main__':
print('main:',os.getpid(),os.getppid())
p = Process(target=func)
p.start()
#main: 824 1272
#1508 824
#同时开启多个子进程
import os
import time
from multiprocessing import Process
def func(name,age):
print('%s start'%name)
time.sleep(1)
print(os.getpid(),os.getppid(),name,age)
if __name__ == '__main__':
# 只会在主进程中执行的所有的代码你写在name = main下
print('main :',os.getpid(),os.getppid())
arg_lst = [('alex',84),('太白', 40),('wusir', 48)]
for arg in arg_lst:
p = Process(target=func,args=arg)
p.start() # 异步非阻塞
# join的用法
import os
import time
import random
from multiprocessing import Process
def func(name,age):
print('发送一封邮件给%s岁的%s\n'%(age,name))
time.sleep(random.random())
print('发送完毕')
if __name__ == '__main__':
arg_lst = [('大壮',40),('alex', 84), ('太白', 40), ('wusir', 48)]
p_lst = []
for arg in arg_lst:
p = Process(target=func,args=arg)
p.start()
p_lst.append(p)
for p in p_lst:p.join()
print('所有的邮件已发送完毕')
#p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
开启进程的另一种方法
面向对象的方法,通过继承和重写run方法完成了启动子进程
通过重写init和调用父类的init完成了给子进程传参数
开启进程的另一种方式
class 类名(Process):
def __init__(self,参数):
self.属性名 = 参数
super().__init__()
def run(self):
print('子进程要执行的代码')
p = 类名()
p.start()
import os
import time
from multiprocessing import Process
class MyProcess(Process):
def __init__(self,a,b,c):
self.a = a
self.b = b
self.c = c
super().__init__()
def run(self):
time.sleep(1)
print(os.getppid(),os.getpid(),self.a,self.b,self.c)
if __name__ == '__main__':
print('-->',os.getpid())
for i in range(10):
p = MyProcess(1,2,3)
p.start()
Process类的一些其他方法\属性
name pid ident
terminate()# 强制结束一个子进程
isalive() 判断子进程是否还在运行