Python的multiprocessing
模块允许创建并行进程,每个进程有自己的Python解释器和内存空间,避免了GIL(全局解释器锁)的限制,适合CPU密集型任务。
套接字是网络通信的基本构建块,允许不同主机或同一主机上的进程之间进行通信。Python通过socket
模块提供对BSD套接字接口的访问。
Process
- 基本进程类Pool
- 进程池Queue
- 进程间通信队列Pipe
- 进程间通信管道Manager
- 共享数据管理器原因:进程间内存隔离,无法直接共享变量
解决方案:
multiprocessing.Value
或Array
Manager
创建共享数据结构Queue
或Pipe
传递数据示例代码:
from multiprocessing import Process, Value, Array
def f(n, a):
n.value = 3.1415927
for i in range(len(a)):
a[i] = -a[i]
if __name__ == '__main__':
num = Value('d', 0.0)
arr = Array('i', range(10))
p = Process(target=f, args=(num, arr))
p.start()
p.join()
print(num.value)
print(arr[:])
原因:默认套接字是阻塞模式
解决方案:
setblocking(False)
设置为非阻塞select
模块处理多连接示例代码(非阻塞套接字):
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setblocking(False)
try:
s.connect(('www.example.com', 80))
except BlockingIOError:
pass
原因:套接字对象无法直接在不同进程间共享
解决方案:
multiprocessing.reduction
传递套接字示例代码(套接字继承):
from multiprocessing import Process
import socket
def worker(sock):
conn, addr = sock.accept()
print(f"Child process connected with {addr}")
conn.send(b"Hello from child")
conn.close()
if __name__ == '__main__':
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 12345))
s.listen(5)
p = Process(target=worker, args=(s,))
p.start()
# 主进程也可以接受连接
conn, addr = s.accept()
print(f"Main process connected with {addr}")
print(conn.recv(1024))
conn.close()
p.join()
s.close()
from multiprocessing import Process
import socket
def handle_client(conn, addr):
print(f"Connected by {addr}")
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
conn.close()
def server():
HOST = '127.0.0.1'
PORT = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen()
while True:
conn, addr = s.accept()
p = Process(target=handle_client, args=(conn, addr))
p.start()
conn.close() # 在父进程中关闭连接,子进程有自己的副本
if __name__ == '__main__':
server()
Pool
)替代频繁创建销毁进程SO_REUSEADDR
选项避免地址占用pickle
协议5)多处理和套接字结合使用时,需要注意资源管理、异常处理和进程间通信等问题,合理设计架构可以充分发挥多核CPU的优势,构建高性能的网络应用。
没有搜到相关的文章