进程池线程池实现TCP高性能并发通信

进程池线程池实现TCP高性能并发通信

使用进程池与线程池实现并发服务,为多个客户进行接收和发送消息的服务

代码实现

# 导入进程池
from multiprocessing import Pool, cpu_count
# 导入线程池
from multiprocessing.pool import ThreadPool
from socket import *
import os
from queue import Queuedef send_data(client, addr, q):# 子进程中无法使用input,而且子进程错误不会展示print(f"【send_data】准备向客户{addr}发送数据...")while True:msg = q.get()if not msg:print(f"【send_data】收到关闭通知, 发送功能关闭!")returnclient.send(f"消息 <{msg}> 已收到!".encode("gbk"))def recv_data(client, addr, q):while True:data = client.recv(1024).decode('gbk')q.put(data)# 客户端调用close; data为 ''  (网络调试助手有缺陷无法执行close,可以使用浏览器测试)if not data:# 往队列写入None,通知发送消息的子线程关闭,并关闭服务套接字q.put('')client.close()print(f"【recv_data】客户{addr}关闭连接, 接收功能关闭!")breakprint(f"【recv_data】 {addr} 发来消息 : {data}\n")# 进程负责处理连接请求(一个进程跟进一个客户)
def process_connect(client, addr):print(f"由进程 {os.getpid()} 为新客户 {addr} 服务!")# 线程负责处理数据请求(一个线程处理客户的一个需求)t_pool = ThreadPool(2)# 创建一个队列,为接收和发送之间传递消息q = Queue()t_pool.apply_async(send_data, (client, addr, q))t_pool.apply_async(recv_data, (client, addr, q))def main():# 创建tcp监听套接字tcp_server_socket = socket(AF_INET, SOCK_STREAM)tcp_server_socket.bind(("192.168.0.180", 9000))tcp_server_socket.listen(128)# 进程池负责接收连接请求(进程池数与cpu处理器数量一致)pool = Pool(cpu_count())while True:# 等待连接请求,获取服务套接字client_socket, client_addr = tcp_server_socket.accept()pool.apply_async(process_connect, (client_socket, client_addr))if __name__ == '__main__':main()

运行效果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/14267.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux操作系统详解

文章目录 引言1. 认识Linux1.1 操作系统概述1.2 认识Linux1.3 虚拟机介绍1.4 远程连接Linux操作系统1.5 WSL1.6 虚拟机快照 2. Linux基础命令2.1 Linux的目录结构2.2 命令入门2.3 目录切换相关命令&#xff08;cd/pwd&#xff09;2.4 相对路径&#xff0c;绝对路径和特殊路径符…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 4 日论文合集)

文章目录 一、检测相关(15篇)1.1 Artifacts Mapping: Multi-Modal Semantic Mapping for Object Detection and 3D Localization1.2 Shi-NeSS: Detecting Good and Stable Keypoints with a Neural Stability Score1.3 HODINet: High-Order Discrepant Interaction Network for…

centos7安装git及maven

安装git 直接使用yum安装&#xff0c;指令如下&#xff1a; yum install git然后执行如下指令判断是否安装完成&#xff1a; git --version紧接着需要维护git的用户名及邮箱等信息 git config --global user.name "zzy" git config --global user.email "ex…

Spring MVC 程序开发

什么是 Spring MVC&#xff1f; 官⽅对于 Spring MVC 的描述是这样的&#xff1a; Spring Web MVC is the original web framework built on the Servlet API and has been included in the Spring Framework from the very beginning. The formal name, “Spring Web MVC,”…

Android App的几个核心概念

Application启动 点击桌面图标启动App(如下流程图) 针对以上流程图示&#xff1a; ActivityManagerService#startProcessLocked()Process#start()ActivityThread#main()&#xff0c;入口分析的地方ActivityThread#attach()&#xff0c;这个里面的逻辑很核心 ActivityManagerS…

【Springboot集成Neo4j完整版教程】

&#x1f680; Neo4j &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;C…

python绘制带有误差棒的条形图

文章目录 bar和barh加入误差棒定制误差棒颜色 bar和barh 在matplotlib中&#xff0c;通过bar和barh来绘制条形图&#xff0c;分别表示纵向和横向的条形图。二者的输入数据均主要为高度x和标签height&#xff0c;示例如下 import matplotlib.pyplot as plt import numpy as np…

使用RabbitMQ

使用RabbitMQ 1 Docker安装RabbitMQ 1.1 安装RabbitMQ # 下载含有管理页面的镜像 docker pull rabbitmq:3.8.8-management# 创建容器 # 5672&#xff1a;应用访问端口&#xff1b;15672&#xff1a;控制台Web端口号&#xff1b; docker run -itd \ --namemy-rabbitmq \ --re…

html,css笔记1

这里写目录标题 一、快捷键及基础常识基础框架2.lang语言种类3.字符集4.HTML常用标签4.1标题标签&#xff08;重要&#xff09;4.2段落和换行标签(重要)4.3文本格式化标签 一、快捷键及基础常识 1.快速复制一行 快捷键&#xff1a;shiftalt下箭头 光标定位到要复制的一行 2.…

CAD绘制三维升旗台

首先绘制长方体的底座 用交叉对角线来定位&#xff0c;绘制一个小一点的矩形&#xff0c;用来定位 大概的效果&#xff1a; 沿着矩形的一个角绘制三个长方体&#xff0c;形成护栏 用阵列或者复制等形成四个角的护栏 旋转&#xff0c;换成真实的效果图&#xff1a; 添加一个圆…

Leetcode刷题笔记--Hot11-20

1--有效的括号&#xff08;20&#xff09; 主要思路&#xff1a; 利用栈&#xff0c;遍历字符串&#xff0c;遇到左括号则入栈&#xff0c;遇到右括号则出栈&#xff0c;并判断出栈元素是否与右括号匹配&#xff1b; 当字符串有效时&#xff0c;栈为空&#xff08;所有左括号都…

多元回归预测 | Matlab麻雀算法(SSA)优化极限梯度提升树XGBoost回归预测,SSA-XGBoost回归预测模型,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 麻雀算法(SSA)优化极限梯度提升树XGBoost回归预测,SSA-XGBoost回归预测模型,多变量输入模型,多变量输入模型,matlab代码回归预测,多