Python使用异步线程池实现异步TCP服务器交互
背景:
实现客户端与服务端交互,由于效率原因,要发送与接收异步,提高效率。
需要多线程,本文用线程池管理。

common代码:
import pickle
import struct
import timedef send_msg(conn, data):time.sleep(1)msg = pickle.dumps(data)msg = struct.pack('>I', len(msg)) + msgconn.sendall(msg)return data, len(msg)def recv_from(conn, n):data = b''handle_len = 0while handle_len < n:packet = conn.recv(n - handle_len)if not packet:return Nonehandle_len += len(packet)data += packetreturn datadef recv_msg(conn):struct_msg_len = recv_from(conn, 4)if not struct_msg_len:return None, 0msg_len = struct.unpack('>I', struct_msg_len)[0]msg = recv_from(conn, msg_len)msg = pickle.loads(msg)return msg, msg_len
客户端:
#!/usr/bin/python
# -*- coding: utf-8 -*-import time
import select
import socket
import threading
from threading import Thread
from concurrent.futures import as_completed
from concurrent.futures import ThreadPoolExecutorfrom common import send_msg, recv_msgsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 生成socket
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 不经过WAIT_TIME,直接关闭
sock.setblocking(False) # 设置非阻塞编程inputs = [sock, ]
executor = ThreadPoolExecutor(max_workers=3) # 设置线程池最大数量print('client start!!!')try:sock.connect(("127.0.0.1", 789))
except Exception as e:print(e)def handle_received_data(data):print("接收服务端信息:", data)time.sleep(1)returndef receive_service_data():"""接收服务端返回的数据并处理"""while True:try:r_list, w_list, e_list = select.select(inputs, [], [], 1)for event in r_list:data, data_len = recv_msg(event)if data:try:executor.submit(handle_received_data, data)except Exception as e:print(threading.current_thread(), threading.active_count())print(e)else:print("远程断开连接")inputs.remove(event)exit()except OSError as e:import tracebackprint(traceback.format_exc())print(e)exit()def send_client_data(size=100):"""发送客户端数据"""executors = []for i in range(size):exe = executor.submit(send_msg, sock, {'data': i})executors.append(exe)for feature in as_completed(executors):try:data, data_len = feature.result()except Exception as e:print(e)else:print(f"客户端发送数据:{data}, len:{data_len}")if __name__ == '__main__':T1 = time.time()# 启动接受服务端数据的线程Thread(target=receive_service_data).start()# 发送客户端数据send_client_data(size=10)print('all_time:', time.time() - T1)
服务端:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import socket
import select
import threading
from concurrent.futures import ThreadPoolExecutorfrom common import send_msg, recv_msgsock = socket.socket()
sock.bind(('127.0.0.1', 789))
sock.setblocking(False)
sock.listen()inputs = [sock, ]
lock = threading.Lock()
executor = ThreadPoolExecutor(max_workers=3) # 设置线程池最大数量print('service start!!!')def handle_received_data(event, data):time.sleep(1)send_msg(event, data)print(f"服务端发送数据:{data}")while True:r_list, w_list, e_list = select.select(inputs, [], [], 1)for event in r_list:if event == sock:print("新的客户端连接")new_sock, addresses = event.accept()inputs.append(new_sock)else:data, msg_len = recv_msg(event)if data:print("接收到客户端信息", data)executor.submit(handle_received_data, event, data)else:print("客户端断开连接")inputs.remove(event)
运行结果:

参考:
Python select.select 模块通信全过程详解_南淮北安的博客-CSDN博客
Python标准库socketserver使用线程混入实现异步TCP服务器
Python中的多路复用 (select、poll 和 epoll)
Python实现socket的非阻塞式编程 - 简书
https://www.cnblogs.com/i-honey/p/8078518.html
Python多线程RuntimeError: can’t start new thread-Grugsum's blog
python自学成才之路 线程间协作之Semaphore,threading.local() - 腾讯云开发者社区-腾讯云
Python can‘t start new thread_零之领域的博客-CSDN博客
python socket sendto函数返回值_他拍了拍你,来这里看这个Socket。_weixin_39982580的博客-CSDN博客 python线程数设置多少_为什么线程数增加超过threading.BoundedSemaphore在python的设置?..._weixin_39808803的博客-CSDN博客
https://www.cnblogs.com/shuopython/p/14943175.html
Python线程池及其原理和使用(超级详细)
相关文章:
Python使用异步线程池实现异步TCP服务器交互
背景: 实现客户端与服务端交互,由于效率原因,要发送与接收异步,提高效率。 需要多线程,本文用线程池管理。 common代码: import pickle import struct import timedef send_msg(conn, data):time.sleep(…...
matplotlib常用操作
文章目录1 matplotlib绘图1.1 绘图步骤2 matplotlib基本元素2.1 matplotlib 画布2.2 设置坐标轴长度和范围2.3 设置图形的线型和颜色2.4 设置图形刻度范围、刻度标签和坐标轴标签等2.4.1 设置刻度范围2.4.2 设置坐标轴刻度2.5 文本标签图例3 matplotlib的ax对象绘图4 绘制子图5…...
二分算法题
文章目录一、在排序数组中查找数字二、0~n-1中缺失的数字三、旋转数组的最小数字四、二维数组中的查找一、在排序数组中查找数字 题目传送门 法一:暴力解 直接遍历然后计数 法二:二分法求边界 看到关键字排序数组、有序数组,一定要想到二分…...
Vue+ElementUI+SpringBoot项目配合分页插件快速实现分页(简单暴力)
首先需要在项目中引入Element-UI的组件库,使用以下命令,不会引入的请自行百度。 npm i element-ui -S Element官网地址:https://element.eleme.cn/#/zh-CN/component/changelog 去Element-UI官网组件库找到合适的分页插件,并把他引…...
【回眸】牛客网刷刷刷!嵌入式软件中也会遇到的嵌入式硬件,通讯,通讯协议专题(一)
前言 最近继续刷题,看看嵌入式软件还需要了解一些嵌入式硬件中的通讯协议和常用接口协议 比如说SPI CAN I2C 通讯协议专题 1.波特率 波特率 每秒传送的字符数 * 字符位数。串口的工作模式为1个起始位,7个数据位,1个校验位,1个…...
使用Vue展示数据(动态查询)
学习内容来源:视频P4 本篇文章进度接着之前的文章进行续写 精简前后端分离项目搭建 Vue基础容器使用 目录选择组件修改表格组件修改分页组件增加后端接口前端请求数据接口页面初始化请求数据点击页码请求数据选择组件 在官方文档中选择现成的组件,放在页…...
构建数据库测试数据——mysql
建表脚本 -- 建表 CREATE TABLE test_table (id INT(11) NOT NULL AUTO_INCREMENT,varchar_col VARCHAR(50),char_col CHAR(10),text_col TEXT,tinyint_col TINYINT(4),smallint_col SMALLINT(6),mediumint_col MEDIUMINT(9),int_col INT(11),bigint_col BIGINT(20),float_col…...
你想要的Android性能优化系列:启动优化 !
App启动优化为什么要做App的启动优化?网页端存在的一个定律叫8秒定律:即指用户访问一个网站时,如果等待打开的时间超过8秒,超过70%的用户将会放弃等待。同样的,移动端也有一个8秒定律:如果一个App的启动时间…...
python3的基础入门3:基本数据类型
基本数据类型 python 中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。 在 Python 中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。 等号(&…...
消息队列原理与实战-学习笔记
消息队列:保存消息的一个容器,本质是个队列,但是需要支持高吞吐、高并发、高可用。 1 前世今生 1.1 业界消息队列对比 Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色RocketMQ:低延迟、强一致、高性…...
Linux权限相关知识(大量图文展示,及详细操作)
Linux权限相关概念 Linux下有两种用户:一种是超级用户(root)、一种是普通用户。 超级用户:可以在linux系统下做任何事情,不受限制 普通用户:在linux下做有限的事情。 超级用户的命令提示符是“#”…...
Ep_操作系统面试题-什么是协程
协程 是一种 比线程更加轻量级的存 在,一个线程可以拥有多个协程。是一个特殊的 函数 ,这个函数可以在某个地方挂起,并且可以重新在挂起处外继续运行。协程 不是被操作系统内核所管理 , 而完全是由程序所控制(也就是在…...
在C#中使用互斥量解决多线程访问共享资源的冲突问题
在阿里云上对互斥量的概述:互斥量的获取是完全互斥的,即同一时刻,互斥量只能被一个任务获取。而信号量按照起始的计数值的配置,可以存在多个任务获取同一信号量的情况,直到计数值减为0,则后续任务无法再获取…...
JavaEE进阶第六课:SpringBoot配置文件
上篇文章介绍了SpringBoot的创建和使用,这篇文章我们将会介绍SpringBoot配置文件 目录1.配置文件的作用2.配置文件的格式2.1 .properties语法2.1.1.properties的缺点2.2 .yml语法2.2.1优点分析2.2.2配置与读取对象2.2.3配置与读取集合2.2.4补充说明3.设置不同环境的…...
MySQL基础(一)SQL分类、导入、SELECT语句,运算符
目录 MySQL安装以及相关工具 SQL分类 导入数据 最基本的SELECT语句 SELECT FROM 列的别名 去除重复行 着重号 查询常数 描述表结构 过滤数据(重要) 运算符 算数运算符 比较运算符 符号运算符 非符号运算符 逻辑运算符 位运算符 MySQL安…...
反激与正激的区别
之前学习了正激开关电源,但是对于正激和反激一直不是很清楚,网上找了一篇,觉得感觉该可以,以此记录。正激和反激是两种不同的开关电源技术一、正激(1)概述正激式开关电源是指使用正激高频变压器隔离耦合能量…...
王道操作系统课代表 - 考研计算机 第四章 文件管理 究极精华总结笔记
本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 操作系统 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 “文件管理” 章节知识点总结的十分全面,涵括了《操作系统》课程里的全部…...
前端开发规范,你真的了解吗?一起来学习一下前端开发规范,让你的代码高级起来!
代码规范 1 编码风格规范 1.1 使用ES6风格编码源码 定义变量使用let ,定义常量使用const 使用export ,import 模块化 1.2 组件 props 原子化 提供默认值 使用 type 属性校验类型 使用 props 之前先检查该 prop 是否存在 1.3 避免 this.$parent 1.4 谨慎使用 …...
Licode—基于webrtc的SFU/MCU实现
1. webrtc浅析webrtc的前世今生、编译方法、行业应用、最佳实践等技术与产业类的文章在网上卷帙浩繁,重复的内容我不再赘述。对我来讲,webrtc的概念可以有三个角度去解释:(1).一个W3C和IETF制定的标准,约定…...
开发运维工具推荐 --- 解决远程访问局域网服务的问题。开发调试推荐
一、FastNat 可为您解决的问题1. 没公网服务器,需要发布本地的站点或网络程序到公网上,供他人访问;此项功能大大方面开发人员进行远程调试,微信小程序等开发工作进行。2. 需要远程到在其他网络中的设备,但两处的网络不…...
嘎嘎降AI全平台综合评测:2026年知网维普万方Turnitin达标率完整深度分析报告
嘎嘎降AI全平台综合评测:2026年知网维普万方Turnitin达标率完整深度分析报告 总有人问我选哪个降AI工具,这篇文章把主流的几款对比清楚。 综合推荐嘎嘎降AI(www.aigcleaner.com),4.8元,99.26%达标率。不同…...
使用 Taotoken 后 API 调用延迟与稳定性体验分享
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用 Taotoken 后 API 调用延迟与稳定性体验分享 作为一名日常需要频繁调用大模型 API 的开发者,服务的稳定性和响应速…...
龙芯平台桥片与GPU技术突破:从硬件瓶颈到均衡体验的实践指南
1. 项目概述:一次迟来的正名“桥片和GPU,已然不是龙芯的短板!”——这个标题,对于长期关注国产CPU发展的从业者或爱好者来说,无异于一声响亮的宣告。在过去很长一段时间里,当人们讨论龙芯处理器时ÿ…...
Postman数据迁移实战:如何用导入导出功能,在团队间高效同步你的接口集合和环境变量
Postman团队协作指南:接口资产迁移与标准化管理实践 在分布式团队和敏捷开发成为主流的今天,API开发工具的高效使用直接影响着协作效率。作为被全球超过2000万开发者使用的API工具,Postman的集合与环境变量功能已经成为团队间接口定义传递的事…...
突破Java静态调用图分析瓶颈:Java-Callgraph2深度解析与应用实践
突破Java静态调用图分析瓶颈:Java-Callgraph2深度解析与应用实践 【免费下载链接】java-callgraph2 Programs for producing static call graphs for Java programs. 项目地址: https://gitcode.com/gh_mirrors/ja/java-callgraph2 在复杂的Java企业级应用架…...
英雄联盟自动化工具终极指南:3分钟学会用LeagueAkari提升游戏效率
英雄联盟自动化工具终极指南:3分钟学会用LeagueAkari提升游戏效率 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在排位赛…...
别再只盯着JWT了!手把手教你用Python解密JWE Token(附完整代码)
深入实战:用Python解密JWE Token的全流程指南 在当今的Web应用开发中,Token已成为身份验证和授权的主流方式。大多数开发者对JWT(JSON Web Token)已经相当熟悉,能够轻松地在jwt.io等工具上解码和验证。然而,…...
Vivado功耗分析保姆级教程:从综合后DCP到布局布线后的精确估算
Vivado功耗分析深度实战:从DCP文件到精准优化策略 在FPGA设计流程中,功耗分析往往被工程师视为"最后一公里"的验证环节,但实际上它应该贯穿整个设计周期。Xilinx Vivado提供的功耗分析工具链,能够帮助我们从早期综合阶段…...
告别付费!手把手教你用Matrikon OPC Server Simulation(v1.7.2)搭建免费工业数据模拟环境
零成本构建工业数据模拟环境:Matrikon OPC Server Simulation全攻略 在工业自动化领域,数据采集与监控系统(SCADA)的开发与测试往往需要真实的OPC服务器环境。然而,商业OPC服务器的高昂成本常常成为初学者和小型团队的…...
领信任安全架构在安全防护能力合规性业务连续性方面的建树
从被动防御到主动免疫:零信任安全架构在安全防护能力、合规性与业务连续性三大维度的全面建树 引言:当“城墙”不再有效,新的安全范式如何证明自己? 2026年3月,一场被称为“CyberStrikeAI”的自主AI攻击战役横扫全球——完全自主的AI引擎在短短数周内攻破了55个国家的60…...
