#创建多进程的用法和常用的属性 from multiprocessing import Process import time import os def func1(): # time.sleep(6) print('这里是孙子进程,孙子自己的pid是%s,孙子的父进程的pid是%s'%(os.getpid(),os.getppid())) def func(): p1 = Process(target=func1) p1.start() # p1.terminate() #如果父进程没有执行,程序可以执行到这里,若是放在这里则杀死进程 # p1.join() #join的位置在 # time.sleep(5) print('这里是儿子进程,儿子自己的pid是%s,儿子的父进程的pid是%s'%(os.getpid(),os.getppid())) # os.getpid()获取的是当前进程自己的pid # os.getppid()获取的是当前进程的父进程的pid if __name__ == '__main__': # for i in range(2): p = Process(target=func) # 实例化一个进程对象,括号内可以给子进程传参数 args=(xxx,) 注意是元组的形式 # p.daemon = True #将子进程进程设置成守护进程,必须要在start之前设置为True #守护进程会随着父进程的终结而终结:守护进程不会再创建子进程 p.start() # 开启一个子进程(可以理解成就绪状态),实际调用run方法执行(理解成执行状态) # p.terminate() #杀死子进程,放在创建父进程strat之后,杀死所有进程,放子进程中,则杀死所有子进程 # c= p.pid #返回子进程的pid,要用变量接住,操作系统随机分配的数字 # print(c) # p.join() #将异步实现同步,等待子进程执行完毕,再执行父进程,可以理解成阻塞,半不执行 # 父进程执行join就是同步,不执行join就是异步关系,必须放在star之后 print('这里是父亲进程,父进程自己的pid是:%s,父亲的父亲的pid是%s'%(os.getpid(),os.getppid()))
一,创建进程的类
Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动) 强调: 1. 需要使用关键字的方式来指定参数 2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
参数介绍
1 group参数未使用,值始终为None 2 3 target表示调用对象,即子进程要执行的任务 4 5 args表示调用对象的位置参数元组,args=(1,2,'egon',) 6 7 kwargs表示调用对象的字典,kwargs={'name':'egon','age':18} 8 9 name为子进程的名称
方法介绍
1 p.start():启动进程,并调用该子进程中的p.run() 2 p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法 3 4 p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁 5 p.is_alive():如果p仍然运行,返回True 6 7 p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
属性介绍
1 p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置 2 3 p.name:进程的名称 4 5 p.pid:进程的pid 6 7 p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可) 8 9 p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)
二,进程间内存是相互隔离的,开启进程的两种方式:
方法一:
#开进程的方法一: import time import random from multiprocessing import Process def piao(name): print('%s piaoing' %name) time.sleep(random.randrange(1,5)) print('%s piao end' %name) p1=Process(target=piao,args=('egon',)) #必须加,号 p2=Process(target=piao,args=('alex',)) p3=Process(target=piao,args=('wupeqi',)) p4=Process(target=piao,args=('yuanhao',)) p1.start() p2.start() p3.start() p4.start() print('主线程')
方法二:
#开进程的方法二: import time import random from multiprocessing import Process class Piao(Process): def __init__(self,name): super().__init__() self.name=name def run(self): print('%s piaoing' %self.name) time.sleep(random.randrange(1,5)) print('%s piao end' %self.name) p1=Piao('egon') p2=Piao('alex') p3=Piao('wupeiqi') p4=Piao('yuanhao') p1.start() #start会自动调用run p2.start() p3.start() p4.start() print('主线程')
三,在windows中Process()必须放到 if __name__ == '__main__' 下面
四,进程中保证信息安全的锁机制:
from multiprocessing import Lock
l = Lock() ====> l.acquire() 获取钥匙,隔离其他进程 l.release() 释放钥匙等待其他进程获取
====> 理解; 这个锁机制就是为了保证数据在运行过程中的安全性而存在的
这个所机制的可以一部分代码(修改共享数据的)串行,有时候位置的摆放会缩减程序的执行效率.
单个进程内指定多个任务去抢同一把锁,作用于局部
示例1:模拟抢票:
from multiprocessing import Process,Lock import time def buy_ticket(i,l): l.acquire() with open('余票','r') as f1: count = int(f1.read()) time.sleep(1) if count > 0: print('