multiprocessing.process的用法

multiprocessing.process的用法

2023年8月2日发(作者:)

s的⽤法⽬录multiprocessing模块仔细说来,multiprocess不是⼀个模块⽽是python中⼀个操作、管理进程的包。 之所以叫multi是取⾃multiple的多功能的意思,在这个包中⼏乎包含了和进程有关的所有⼦模块。由于提供的⼦模块⾮常多,为了⽅便⼤家归类记忆,我将这部分⼤致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。s模块process模块是⼀个创建进程的模块,借助这个模块,就可以完成进程的创建。process模块介绍Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,表⽰⼀个⼦进程中的任务(尚未启动)强调:1. 需要使⽤关键字的⽅式来指定参数2. args指定的为传给target函数的位置参数,是⼀个元组形式,必须有逗号参数介绍:group参数未使⽤,值始终为Nonetarget表⽰调⽤对象,即⼦进程要执⾏的任务args表⽰调⽤对象的位置参数元组,args=(1,2,'egon',)kwargs表⽰调⽤对象的字典,kwargs={'name':'egon','age':18}name为⼦进程的名称⽅法介绍():启动进程,并调⽤该⼦进程中的()():进程启动时运⾏的⽅法,正是它去调⽤target指定的函数,我们⾃定义类的类中⼀定要实现该⽅法ate():强制终⽌进程p,不会进⾏任何清理操作,如果p创建了⼦进程,该⼦进程就成了僵⼫进程,使⽤该⽅法需要特别⼩⼼这种情况。如果p还保存了⼀个锁那么也将不会被释放,进⽽导致死锁_alive():如果p仍然运⾏,返回([timeout]):主线程等待p终⽌(强调:是主线程处于等的状态,⽽p是处于运⾏的状态)。timeout是可选的超时时间,需要强调的是,只能join住start开启的进程,⽽不能join住run开启的进程3.2 属性介绍:默认值为False,如果设为True,代表p为后台运⾏的守护进程,当p的⽗进程终⽌时,p也随之终⽌,并且设定为True后,p不能创建⾃⼰的新进程,必须在()之前设置:进程的名称:进程的de:进程在运⾏时为None、如果为–N,表⽰被信号N结束(了解即可)y:进程的⾝份验证键,默认是由m()随机⽣成的32字符的字符串。这个键的⽤途是为涉及⽹络连接的底层进程间通信提供安全性,这类连接只有在具有相同的⾝份验证键时才能成功(了解即可)3.3 在windows中使⽤process模块的注意事项在Windows操作系统中由于没有fork(linux操作系统中创建进程的机制),在创建⼦进程的时候会⾃动 import 启动它的这个⽂件,⽽在 import的时候⼜执⾏了整个⽂件。因此如果将process()直接写在⽂件中就会⽆限递归创建⼦进程报错。所以必须把创建⼦进程的部分使⽤if__name__ =='__main__ 判断保护起来,import 的时候,就不会递归运⾏了。Process的⽤法⼀、jion⽤法内部会调⽤wait(),等待执⾏完毕,回收pid1.1 jion⽤法1from multiprocessing import Processimport timedef foo(): print('process start') (2) print('process end')if __name__ == '__main__': p = Process(target=foo) #创建⼦进程 ()#给操作系统发指令,开启⼦进程 (5) ()#阻塞住主进程再等待⼦进程结束,然后再往下执⾏,(了解的是:内部会待⽤wait()) print('主进程')#

process startprocess end主进程1.2join⽤法2from multiprocessing import Processimport timedef foo(x): print('Process start') (x) print('Process end')if __name__ == '__main__': p1 = Process(target=foo,args=(1,)) #进程传参的固定模式 p2 = Process(target=foo,args=(2,)) p3 = Process(target=foo,args=(3,)) start = () () () () () () () end = () print(end-start) print('主进程')#进程是同时开启的,不确定是哪⼀个先开启,并且创建⼦进程需要时间,因此是3秒多Process startProcess startProcess startProcess endProcess endProcess end3.1426主进程join⽤法2,优化from multiprocessing import Processimport timedef foo(x): print(f'process{x},start') (x) print(f'process{x},end')if __name__ == '__main__': strart = () p_list = [] for i in range(1,4): p=Process(target=foo,args=(i,)) () p_(p) print(p_list) for p in p_list: () end = () print(end-strart) print('主进程')

#

[, , ]process1,startprocess2,startprocess3,startprocess1,endprocess2,endprocess3,end3.1335主进程1.3 join⽤法3from multiprocessing import Processimport timedef foo(x): print(f'process{x},start') (x) print(f'process{x},end')if __name__ == '__main__': p1 = Process(target=foo,args=(1,)) p2 = Process(target=foo,args=(2,)) p3 = Process(target=foo,args=(3,)) start = () () () () () () () end = () print(end-start) print('主进程结束')#由于每⼀个进程都是在执⾏完后才会执⾏下⼀个进程,因此,时间是多余6s,创建⼦进程空间是需要时间的process1,startprocess1,endprocess2,startprocess2,endprocess3,startprocess3,end6.339主进程结束⼆、查询进程的pid进程的pid,相当于⼈的id⾝份证⼀样from multiprocessing import Process,current_processimport osimport timedef task(): print('⼦进程 start') print('在⼦进程中查询⾃⼰的pid>',current_process().pid) print('在⼦进程中查询⽗进程的pid>',d()) (200) print('⼦进程end')if __name__ == '__main__': p = Process(target=task) () print('在主进程中查看⼦进程的pid>',)#⼀定要写在start之后,在给操作系统发送开启⼦进程之后 print('主进程的pid>',()) print('主进程的⽗进程的pid>',d()) print('主进程')

###在主进程中查看⼦进程的pid> 11112主进程的pid> 7320主进程的⽗进程的pid> 2464主进程⼦进程 start在⼦进程中查询⾃⼰的pid> 11112在⼦进程中查询⽗进程的pid> 7320三,查询进程名namefrom multiprocessing import Process,current_processimport timedef foo(): print('process start') print('⼦进程的名字',current_process().name) (2) print('process end')if __name__ == '__main__': p = Process(target=foo) p2 = Process(target=foo) p3 = Process(target=foo,name='ocean') () () () print() print() print() print('主进程')################Process-1Process-2ocean主进程process start⼦进程的名字 Process-1process start⼦进程的名字 Process-2process start⼦进程的名字 oceanprocess endprocess endprocess end四、判断进程的⽣死is_alive()from multiprocessing import Processimport timedef foo(): print('process start') (2) print('process end')if __name__ == '__main__': p = Process(target=foo) () print(_alive())#True,进程开启,进程或者 (5) print(_alive())#False 代码运⾏完毕,进程死亡(系统判定,实际情况在具体分析) print('主进程')

##############Trueprocess startprocess endFalse主进程五、杀死进程terminate()from multiprocessing import Processimport timedef foo(): print('process start') (10) print('process end')if __name__ == '__main__': p = Process(target=foo) () ate()#给操作系统发送⼀个请求,杀死进程的请求 print(_alive()) () print(_alive()) print('主进程')###############TrueFalse主进程六、通过继承Process类开启进程import osfrom multiprocessing import Processclass MyProcess(Process): def __init__(self,name): # super(MyProcess,self).__init__() super().__init__() =name def run(self): print(()) print('%s 正在和⼥主播聊天' %)if __name__ == '__main__': p1=MyProcess('wupeiqi') p2=MyProcess('yuanhao') p3=MyProcess('nezha') () # start会⾃动调⽤run () # () () () () () print('主线程')

####################1516wupeiqi 正在和⼥主播聊天4864yuanhao 正在和⼥主播聊天18228nezha 正在和⼥主播聊天主线程七、进程间的数据隔离问题from multiprocessing import Processdef work(): global n n = 0 print('⼦进程内:',n)if __name__ == '__main__': n = 100 p = Process(target=work) () print('主进程内:',n)##############主进程内: 100⼦进程内: 0

发布者:admin,转转请注明出处:http://www.yc00.com/web/1690958106a472917.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信