5.1.6 练习题
Posted beallaliu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5.1.6 练习题相关的知识,希望对你有一定的参考价值。
1. 进程之间内存空间是隔离还是共享的?
请看代码的输出结果:
from multiprocessing import Process n=100 #在windows系统中应该把全局变量定义在if __name__ == ‘__main__‘之上就可以了 def work(): global n n=0 print(‘子进程内: ‘,n) if __name__ == ‘__main__‘: p=Process(target=work) p.start() p.join() print(‘主进程内: ‘,n)
输出结果:
子进程内: 0
主进程内: 100
结论:进程之间的内存空间是隔离的。子进程创建时,拷贝走了主进程的内存数据,存放在自己独立的内存空间上,不会影响主进程的内存数据。
2. 基于多进程实现并发的套接字通信
服务器端:
import socket from multiprocessing import Process def community(conn): while True: try: data = conn.recv(1024) if not data: continue conn.send(data.upper()) except ConnectionResetError: break conn.close() def fun_server(IP, PORT): server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind((IP, PORT)) server.listen(5) while True: conn, client_addr = server.accept() p = Process(target=community, args=(conn,)) # 为每一个连接都开一个子进程,然后继续监听新连接。弊端:并发多的程序,连接数据限制。 p.start() server.close() if __name__ == ‘__main__‘: fun_server(‘127.0.0.1‘, 8080)
客户端:
import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print(client) client.connect((‘127.0.0.1‘, 8080)) print(client) while True: data = input(‘>>‘).strip() if not data: continue client.send(data.encode(‘utf8‘)) data = client.recv(1024).decode(‘utf8‘) print(data) conn.close()
3. join的应用
有以下代码,分别控制输出:
from multiprocessing import Process import time import random def task(n): time.sleep(random.randint(1,3)) print(‘-------->%s‘ %n) if __name__ == ‘__main__‘: p1=Process(target=task,args=(1,)) p2=Process(target=task,args=(2,)) p3=Process(target=task,args=(3,)) p1.start() p2.start() p3.start() print(‘-------->4‘)
3.1 最先输出-------->4
原代码就好,无需改动。子进程有睡,不管怎么样都会先输出4.
3.2. 最后输出-------->4
修改:
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
3.3 按顺序输出
-------->1
-------->2
-------->3
-------->4
修改:
p1.start()
p1.join()
p2.start()
p2.join()
p3.start()
p3.join()
以上是关于5.1.6 练习题的主要内容,如果未能解决你的问题,请参考以下文章
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段