day33 创建进程的方法和相关操作

方法一:

multiprocess不是一个模块而是python中一个操作、管理进程的包。 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块。由于提供的子模块非常多,为了方便大家归类记忆,我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。重点强调:进程没有任何共享状态,进程修改的数据,改动仅限于该进程内

from multiprocessing import Process

def func(n):
print(n)
if __name__=="__main__":
p=Process(target=func,args=(5,)) #创建子进程,并传参,参数元组形式 也可以传关键字参数kwargs={"n":5}必须是字典key要与方法中的形参相同一致
p.start() #操作系统发送指令创建进程并运行target=方法
方法二:
from multiprocessing import Process
class MyProcess(Process):   #创建类
def __init__(self,n,name):
super().__init__() #执行下一个mro 直接写不加任何参数
self.n=n #传参数
self.name=name
def run(self): #重写run方法
print(self.n)
print("子进程名称",self.name)
print("子进程pid",self.pid)
if __name__=="__main__":
p=MyProcess(100,name="子进程1") #创建进程
p.start() #操作系统发送指令开辟进程并运行run方法
print("pid",p.pid)
参数介绍:
参数介绍:
1 group参数未使用,值始终为None
2 target表示调用对象,即子进程要执行的任务
3 args表示调用对象的位置参数元组,args=(1,2,'egon',)
4 kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
5 name为子进程的名称

进程之间是空间隔离的:
#我们说进程之间的数据是隔离的,也就是数据不共享,看下面的验证:
from multiprocessing import Process
import time
n=100 #首先我定义了一个全局变量,在windows系统中应该把全局变量定义在if __name__ == '__main__'之上就可以了
def work():
    global n
    n=0
    print('子进程内: ',n)
if __name__ == '__main__':
    p=Process(target=work)
    p.start()
    time.sleep(2)
    p.join() #等待子进程执行完毕,如果数据共享的话,我子进程是不是通过global将n改为0了,但是你看打印结果,主进程在子进程执行结束之后,仍然是n=100,子进程n=0,说明子进程对n的修改没有在主进程中生效,说明什么?说明他们之间的数据是隔离的,互相不影响的
    print('主进程内: ',n)
#看结果:
# 子进程内:  0
# 主进程内:  100
process中的其他操作方法:
1. p.start():启动进程,并调用该子进程中的p.run()
2. p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法 
3. p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
4. p.is_alive():如果p仍然运行,返回True
5. p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
for循环在并发中的使用:
# 验证for循环
def func1(i):
time.sleep(1)
print(i)
if __name__=="__main__":
lst=[]
for i in range(10):
p1=Process(target=func1,args=(i,))
p1.start()
lst.append(p1)
for el in lst: 在对象后加join
el.join()
print("主程序运行完成")
验证并发时间:

# 验证并发时间
# def func1(n):
# time.sleep(n)
# print(n)
# def func2(n):
# time.sleep(n)
# print(n)
# def func3(n):
# time.sleep(n)
# print(n)
# if __name__=="__main__":
# p1=Process(target=func1,args=(1,))
# p2=Process(target=func2,args=(2,))
# p3=Process(target=func3,args=(3,))
# p1.start()
# p2.start()
# p3.start()
# print("主程序运行完成")
子进程开启之后咱们是没法操作的,并且没有为子进程input输入提供控制台,所有你再在子进程中写上了input会报错,EOFError错误
原文地址:https://www.cnblogs.com/litieshuai/p/9837323.html