博客
关于我
python单线程下实现多个socket并发
阅读量:800 次
发布时间: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/

你可能感兴趣的文章
python 字符串显示中文_Python字符串开头的b"、u"、r"与中文乱码
查看>>
Python 字符串的几种拼装方式
查看>>
python 存入数据库bigint_python基础_MySQL的bigint类型
查看>>
python 学习 面向对象编程
查看>>
Python 学习日记第三篇 -- 字典
查看>>
Python 学习笔记(一)Data type
查看>>
python 安装echarts
查看>>
python 安装opencv及问题解决
查看>>
Python 安装程序:“写入文件 C:\Python27\pythonw.exe 时出错“
查看>>
Python 安装避坑指南:从入门到进阶
查看>>
Python 安装配置详解
查看>>
python 实现儿童算术游戏
查看>>
python 实现字符串转整型
查看>>
Python 实现定时任务的八种方案!
查看>>
Python 实现自动化测试 dubbo 协议接口
查看>>
python 对json数据读取及保存与读取,对dump,dumps,load,loads的理解
查看>>
Python 对mysql数据库的操作
查看>>
Python 对象数据库列表
查看>>
Python 导入requests报错No module named requests
查看>>
python 将函数加到列表中进行调用
查看>>