4.1 - 并发编程 - 进程练习题
1.思考开启进程的方式一和方式二各开启了几个进程?
开启进程有两种方式,Process(),自定义类继承(Process),开启个数是一样的
2.进程之间的内存空间是共享的还是隔离的?下述代码的执行结果是什么?
隔离的
1 from multiprocessing import Process 2 n=100 #在windows系统中应该把全局变量定义在if __name__ == '__main__'之上就可以了 3 def work(): 4 global n 5 n=0 6 print('子进程内: ',n) 7 8 if __name__ == '__main__': 9 p=Process(target=work) 10 p.start() 11 p.join() 12 print('主进程内: ',n) 13 """ 14 子进程内: 0 15 主进程内: 100 16 """
3.基于多进程实现并发的套接字通信?
server:
1 # -*- coding:utf-8 -*- 2 import socket 3 from multiprocessing import Process 4 5 def task(conn): 6 while True: 7 try: 8 data = conn.recv(1024) 9 if not data:continue 10 conn.send(data.upper()) 11 except Exception: 12 break 13 conn.close() 14 15 def server(ip,port): 16 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 17 server.bind((ip,port)) 18 server.listen(5) 19 while True: 20 conn,client_addr=server.accept() 21 p = Process(target=task,args=(conn,)) 22 p.start() 23 server.close() 24 25 if __name__ == "__main__": 26 server('127.0.0.1',8080)
client:
1 # -*- coding:utf-8 -*- 2 import socket 3 4 client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 5 client.connect(('127.0.0.1',8080)) 6 while True: 7 msg = input('>>>:').strip() 8 if not msg:continue 9 client.send(msg.encode('utf-8')) 10 data = client.recv(1024) 11 print(data.decode('utf-8'))
4.思考每来一个客户端,服务端就开启一个新的进程来服务它,这种实现方式有无问题? 有 不能无限开进程
5.改写下列程序,分别别实现下述打印效果
1 from multiprocessing import Process 2 import time 3 import random 4 5 def task(n): 6 time.sleep(random.randint(1,3)) 7 print('-------->%s' %n) 8 9 if __name__ == '__main__': 10 p1=Process(target=task,args=(1,)) 11 p2=Process(target=task,args=(2,)) 12 p3=Process(target=task,args=(3,)) 13 14 p1.start() 15 # p1.join() 16 p2.start() 17 # p2.join() 18 p3.start() 19 # p3.join() 20 21 p1.join() 22 p2.join() 23 p3.join() 24 25 print('-------->4') 26 27 # 效果一:保证最先输出 - ------->4 并发 28 # 29 # -------->4 30 # -------->1 31 # -------->3 32 # -------->2 33 # 效果二:保证最后输出 - ------->4 并发 34 # 35 # -------->2 36 # -------->3 37 # -------->1 38 # -------->4 39 # 效果三:保证按顺序输出 串行 40 # 41 # -------->1 42 # -------->2 43 # -------->3 44 # -------->4