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()

 

猜你喜欢

转载自www.cnblogs.com/beallaliu/p/9190372.html