博客
关于我
python单线程下实现多个socket并发
阅读量:797 次
发布时间:2023-03-07

本文共 1829 字,大约阅读时间需要 6 分钟。

使用gevent、多线程和多进程实现高并发客户端连接

服务端实现

在服务端,我们使用gevent库来实现非阻塞的TCP服务器。这种方法能够显著提升服务器的吞吐量,特别是在处理大量并发连接时。gevent通过 monkey.patch_all() 将socket模块的关键函数改为非阻塞模式,这使得服务器可以在不等待客户端连接的情况下继续处理其他请求。

import gevent
from gevent import socket
monkey.patch_all()
def server(port):
s = socket.socket()
s.bind(("127.0.0.1", port))
s.listen(2000)
while True:
client, addr = s.accept()
gevent.spawn(handle_request, client)
def handle_request(s):
try:
while True:
data = s.recv(1024)
print("收到的信息:{}".format(data.decode("utf-8")))
if not data:
s.shutdown(socket.SHUT_WR)
except Exception as e:
print("异常:{}".format(e))
finally:
s.close()

客户端实现

在客户端,我们通过多线程和多进程的方式同时建立多个连接。两种方法各有优劣,需要根据实际需求选择。

多线程实现

import socket
import threading
ip_addr = ("127.0.0.1", 8000)
c = socket.socket()
c.connect(ip_addr)
def handle_client(n):
while True:
data = str(n)
c.send(data.encode("utf-8"))
received = c.recv(1024)
print("服务器回复:{}".format(received.decode("utf-8")))
c.close()
if __name__ == "__main__":
for i in range(500):
thread = threading.Thread(target=handle_client, args=(i,))
thread.start()

多进程实现

import socket
import multiprocessing
ip_addr = ("127.0.0.1", 8000)
c = socket.socket()
c.connect(ip_addr)
def handle_client(n):
while True:
data = str(n)
c.send(data.encode("utf-8"))
received = c.recv(1024)
print("服务器回复:{}".format(received.decode("utf-8")))
c.close()
if __name__ == "__main__":
for i in range(100):
p = multiprocessing.Process(target=handle_client, args=(i,))
p.start()

对比分析

  • 多线程:每个线程共享同一个socket连接,这意味着所有线程会竞争同一个IP地址和端口,这在实际中可能导致连接被拒绝或不稳定。
  • 多进程:每个进程都有自己的socket连接,可以独立与服务器通信,但会占用更多的内存资源。

在实际应用中,选择哪种方式取决于任务的负载要求和系统资源情况。

转载地址:http://bhofk.baihongyu.com/

你可能感兴趣的文章