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)
View Code

输出结果:

技术分享图片
子进程内:  0
主进程内:  100
View Code

结论:进程之间的内存空间是隔离的。子进程创建时,拷贝走了主进程的内存数据,存放在自己独立的内存空间上,不会影响主进程的内存数据。

 

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)
View Code

客户端:

技术分享图片
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()
View Code

 

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对象(代码片段

csharp Epicor标准练习片段

golang 去练习片段

ktor HTTP API 练习

小片段中的 ORA-06512 [重复]

指针练习:输出Hello