标签:接口 turn 启动进程 put 需要 pre exception group sleep
python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进程。
Python提供了multiprocessing。 multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,>提供了Process、Queue、Pipe、Lock等组件。
需要再次强调的一点是:与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。
创建进程的类:
Process([group [, target [, name [, args [, kwargs]]]]]),由该类实例化得到的对象,可用来开启一个子进程
强调:
1. 需要使用关键字的方式来指定参数
2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
参数介绍:
group参数未使用,值始终为None
target表示调用对象,即子进程要执行的任务
args表示调用对象的位置参数元组,args=(1,2,‘egon‘,)
kwargs表示调用对象的字典,kwargs={‘name‘:‘egon‘,‘age‘:18}
name为子进程的名称
方法介绍:
p.start():启动进程,并调用该子进程中的p.run()
p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
p.is_alive():如果p仍然运行,返回True
p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间。
属性介绍:
p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
p.name:进程的名称
p.pid:进程的pid
注意:在windows中Process()必须放到# if __name__ == ‘__main__‘:下
创建并开启子进程的方式一
1 from multiprocessing import Process 2 import time 3 4 def task(name): 5 print("%s is running" % name) 6 time.sleep(3) 7 print("%s is done" % name) 8 9 10 if __name__ == "__main__": 11 p = Process(target=task, kwargs={"name": "子进程1"}) 12 p.start() 13 print("主")
创建并开启子进程的方式二
1 from multiprocessing import Process 2 import time 3 4 class MyProcess(Process): 5 def __init__(self, name): 6 super().__init__() 7 self.name = name 8 9 def run(self): 10 """ 11 默认方法run 12 :return: 13 """ 14 print("%s is running" % self.name) 15 time.sleep(3) 16 print("%s is done " % self.name) 17 18 19 if __name__ == "__main__": 20 p = MyProcess("子进层1") 21 p.start()
1、思考开启进程的方式一和方式二各开启了几个进程?
答:各开启了两进程
2、进程之间的内存空间是共享的还是隔离的?下述代码的执行结果是什么?
1 from multiprocessing import Process 2 3 #在windows系统中应该把全局变量定义在if __name__ == ‘__main__‘之上就可以了 4 n=100 5 6 def work(): 7 global n 8 n=0 9 print(‘子进程内: ‘,n) 10 11 12 if __name__ == ‘__main__‘: 13 p=Process(target=work) 14 p.start() 15 print(‘主进程内: ‘,n)
答:内存空间是隔离的。
代码运行结果:
主进程内: 100
子进程内: 0
3、基于多进程实现并发的套接字通信?
服务端:
1 import socket 2 from multiprocessing import Process 3 def talk(conn): 4 while True: 5 try: 6 res = conn.recv(1024) 7 if not res: 8 continue 9 conn.send(res.upper()) 10 except Exception as e: 11 print(‘\033[1;31m客户端出现错误,关闭连接!---->\033[0m‘, e) 12 break 13 conn.close() 14 15 def serve(ip, port): 16 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 17 server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 18 server.bind((ip, port)) 19 server.listen(5) 20 21 while True: 22 conn, client_addr = server.accept() 23 p = Process(target=talk, args=(conn,)) 24 p.start() 25 26 27 if __name__ == "__main__": 28 serve("127.0.0.1", 8080)
客户端:
1 import socket 2 3 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 4 5 client.connect(("127.0.0.1", 8080)) 6 while True: 7 cmd = input(">>>:").strip() 8 if not cmd:continue 9 client.send(cmd.encode("utf-8")) 10 res = client.recv(1024) 11 print(res.decode("utf-8"))
思考每来一个客户端,服务端就开启一个新的进程来服务它,这种实现方式有无问题?
答:有问题,如果客户端越来越多,多道一定的数目,服务端会奔溃:
标签:接口 turn 启动进程 put 需要 pre exception group sleep
原文地址:https://www.cnblogs.com/cyanjng/p/9813470.html