112 Python程序中的进程操作-开启多进程(multiprocess.process)
目录
运行中的程序就是一个进程。所有的进程都是通过它的父进程来创建的。因此,运行起来的python程序也是一个进程,那么我们也可以在程序中再创建进程。多个进程可以实现并发效果,当我们的程序中存在多个进程的时候,在某些时候,就会让程序的执行速度变快。 在linux c语言中创建线程使用的fork函数,而Python就需要借助响应的模块 一、multiprocess模块仔细说来,multiprocess不是一个模块而是python中一个操作、管理进程的包。 之所以叫multi是取自multiple的多功能的意思,在这个包中几乎包含了和进程有关的所有子模块。由于提供的子模块非常多,为了方便大家归类记忆,我将这部分大致分为四个部分:创建进程部分,进程同步部分,进程池部分,进程之间数据共享。 二、multiprocess.process模块process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。 三、process模块
强调:
参数介绍:
3.1 方法介绍
3.2 属性介绍
3.3 在windows中使用Process类的注意事项在Windows操作系统中由于没有fork(linux操作系统中创建进程的机制),在创建子进程的时候会自动 import 启动它的这个文件,而在 import 的时候又执行了整个文件。因此如果将process()直接写在文件中就会无限递归创建子进程报错。所以必须把创建子进程的部分使用 四、process类的使用在一个python进程中开启子进程,start方法和并发效果。 4.1 创建并开启子进程的两种方式
4.2 join方法join方法用于回收子进程 from multiprocessing import Process import time def foo(x): print('进程 start ') time.sleep(x) print('进程 end ') if __name__ == '__main__': ### 串行执行和回收子进程 # p = Process(target=foo,args=(1,)) # p2 = Process(target=foo,args=(2,)) # p3 = Process(target=foo,args=(3,)) # p.start() # # p.join() # 阻塞住主进程再等待子进程结束,然后再往下执行,(了解的是:内部会待用wait()) # p2.start() # p2.join() # p3.start() # p3.join() # print('主') # 并发执行进程,并依次回收 p = Process(target=foo,)) p2 = Process(target=foo,)) p3 = Process(target=foo,)) # 开启进程 p.start() p2.start() p3.start() # 回收进程 p.join() # 阻塞住主进程再等待子进程结束,然后再往下执行,(了解的是:内部会待用wait()) p2.join() p3.join() print('主') 4.3 查看主进程和子进程的进程号from multiprocessing import Process,current_process import time import os ''' 查看主进程和子进程的进程号 1. 通过os.getpid()方法 2. 通过multiprocessing模块中的current_process().pid ''' def task(name,x): print("当前进程pid:",current_process().pid) print(f"{name} start") time.sleep(x) print(f"{name} end") if __name__ == '__main__': p = Process(target=task,args=("进程1",1)) p.start() # 方式一 print("子进程pid:",p.pid) # 方式二 # print("当前进程pid:",current_process().pid) print("当前进程pid",os.getpid()) print("主进程的父进程pid",os.getppid()) # 实际上是pycharm的进程号 print() 4.4 查看进程名和进程状态、设置进程名''' process设置名字: name属性 process判断进程是否存在:is_alive ''' from multiprocessing import Process import time def task(x): print("进程 start") time.sleep(x) print("进程 end") if __name__ == '__main__': p = Process(target=task,)) p.start() p.name = "进程1" print(p.name) print("子进程是否存在:",p.is_alive()) # True time.sleep(2) # 延时2秒等待子进程结束 print("子进程是否存在:",p.is_alive()) # False print("主进程") 4.5 terminate结束子进程''' terminate() 告诉子进程让他结束 ''' from multiprocessing import Process import time def task(x): print("进程 start") time.sleep(x) print("进程 end") if __name__ == '__main__': p = Process(target=task,args=(10,)) p.start() p.terminate() # 告诉子进程让他提前结束 p.name = "进程1" print(p.name) print("子进程是否存在:",p.is_alive()) # True p.join() print("子进程是否存在:",p.is_alive()) # False print("主进程") 4.6 Process中的守护进程首先,博主自己测试,实验。Process中守护进程的部分和真正的守护进程概念并不一样,因此只需要知道Process的守护进程即可。 ''' daemon = True 把子进程变为守护进程 主进程的代码执行完毕守护进程直接结束。但如果子进程代码结束也会结束 ''' from multiprocessing import Process import time def task(x): print("进程 start") time.sleep(x) print("进程 end") if __name__ == '__main__': p = Process(target=task,)) p.daemon = True # 把子进程变为守护进程 p.start() # print(p.pid) p.name = "进程1" print(p.name) print("子进程pid:",p.pid) # print("子进程是否存在:",p.is_alive()) # True time.sleep(3) print("子进程是否存在:",p.is_alive()) # False print("主进程") print("子进程是否存在:",p.is_alive()) # False time.sleep(200) 五、socket聊天并发实例5.1 使用多进程实现socket聊天并发-server端import socket from multiprocessing import Process def talk(conn,client_addr): while 1: msg = conn.recv(1024) if not msg: break print(msg.decode("utf8")) conn.send(msg.upper()) print(111) if __name__ == '__main__': # 必须要写在里面,不然会因为创建子线程重复调用导致端口被占用 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.bind(("127.0.0.1",8087)) server.listen(5) while 1: print("等待连接") conn,addr = server.accept() print(addr,"连接成功") p = Process(target=talk,args=(conn,addr)) p.start() 5.2 使用多进程实现socket聊天并发-client端import socket if __name__ == '__main__': client = socket.socket() client.connect(("127.0.0.1",8087)) while 1: msg = input("请输入内容") client.send(msg.encode("utf8")) msg = client.recv(1024).decode("utf8") print(msg) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |