基于线程池的多并发Socket程序的实现
Socket“服务器-客户端”模型的多线程并发实现效果的大体思路是:首先,在Server端建立“链接循环”,每一个链接都开启一个“线程”,使得每一个Client端都能通过已经建立好的线程来同时与Server通信,代码如下:
# -*- coding: utf-8 -*-
# -*- Author: WangHW -*-
import socket
from threading import Thread def Communication(conn):
# 通信循环
while 1:
try:
data = conn.recv(1024)
if not data:
break
print('Client Data:', data.decode('utf-8'))
conn.send(data.upper())
except ConnectionResetError:
break def Server(ip,post):
whw_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
whw_server.bind((ip,post))
whw_server.listen(5)
# 链接循环
while 1:
conn, addr = whw_server.accept()
#创建线程
t = Thread(target=Communication,args=(conn,))
t.start() if __name__ == '__main__':
#主线程干Server的工作
Server('127.0.0.1',9000)
Server
# -*- coding: utf-8 -*-
# -*- Author: WangHW -*-
import socket whw_client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
whw_client.connect(('127.0.0.1',9000)) while 1:
msg = input('>>>:').strip()
if not msg:
continue
whw_client.send(msg.encode('utf-8'))
data = whw_client.recv(1024)
print('Server Data:',data.decode('utf-8'))
Client
运行效果如下:

但是,这样的设计存在一个十分严重的问题:由于Server端存在性能问题,因此它不能无限的去开启线程,也就是说服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这会对服务端主机带来巨大的压力,甚至于不堪重负而瘫痪,于是我们必须对服务端开启的线程数加以控制,让机器在一个自己可以承受的范围内运行。
而解决的办法就是利用“线程池”:线程池就是用来存放线程的池子,本质还是基于多线程,只不过是对开启线程的数目加上了限制:
基于线程池的多线程的Server端的代码如下:
# -*- coding: utf-8 -*-
# -*- Author: WangHW -*-
import socket
from concurrent.futures import ThreadPoolExecutor def Communication(conn):
# 通信循环
while 1:
try:
data = conn.recv(1024)
if not data:
break
print('Client Data:', data.decode('utf-8'))
conn.send(data.upper())
except ConnectionResetError:
break def Server(ip,post):
whw_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
whw_server.bind((ip,post))
whw_server.listen(5)
# 链接循环
while 1:
conn, addr = whw_server.accept() pool.submit(Communication,conn) if __name__ == '__main__':
#最多可开client端为2个
pool = ThreadPoolExecutor(2) #主线程干Server的工作
Server('127.0.0.1',9000)
Server-线程池
我们在线程池设置了最多可以有2个客户端与服务器端通信,所以当第三个客户端试图去与服务器端建立链接时是没有用的,只有当其中的一个客户端停掉才能通信:

基于线程池的多并发Socket程序的实现的更多相关文章
- 设计模式:基于线程池的并发Visitor模式
1.前言 第二篇设计模式的文章我们谈谈Visitor模式. 当然,不是简单的列个的demo,我们以电商网站中的购物车功能为背景,使用线程池实现并发的Visitor模式,并聊聊其中的几个关键点. 一,基 ...
- 【Java TCP/IP Socket】基于线程池的TCP服务器(含代码)
了解线程池 在http://blog.csdn.net/ns_code/article/details/14105457(读书笔记一:TCP Socket)这篇博文中,服务器端采用的实现方式是:一个客 ...
- Linux中epoll+线程池实现高并发
服务器并发模型通常可分为单线程和多线程模型,这里的线程通常是指“I/O线程”,即负责I/O操作,协调分配任务的“管理线程”,而实际的请求和任务通常交由所谓“工作者线程”处理.通常多线程模型下,每个线程 ...
- requests模块session处理cookie 与基于线程池的数据爬取
引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的,例如: #!/usr/bin/ ...
- Python网络爬虫之cookie处理、验证码识别、代理ip、基于线程池的数据爬去
本文概要 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时, ...
- 超越线程池:Java并发并没有你想的那么糟糕
转载: 超越线程池:Java并发并没有你想的那么糟糕
- 基于线程池的多线程售票demo2.0(原创)
继上回基于线程池的多线程售票demo,具体链接: http://www.cnblogs.com/xifenglou/p/8807323.html以上算是单机版的实现,特别使用了redis 实现分布式锁 ...
- 基于线程池的多线程售票demo(原创)
废话不多说,直接就开撸import org.springframework.util.StopWatch;import java.util.concurrent.*;/** * 基于线程池实现的多线程 ...
- Tomcat如何使用线程池处理远程并发请求
Tomcat如何使用线程池处理远程并发请求 通过了解学习tomcat如何处理并发请求,了解到线程池,锁,队列,unsafe类,下面的主要代码来自 java-jre: sun.misc.Unsafe j ...
随机推荐
- 【spring源码分析】spring和@PostConstruct注解
@PostConstruct注解好多人以为是Spring提供的.其实是Java自己的注解. Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法.被@Pos ...
- struts2(二)值栈 threadlocal ogal ui
值栈(重要)和ognl表达式 1. 只要是一个mvc框架,必须解决数据的存和取的问题 2. Struts2利用值栈来存数据,所以值栈是一个存储数据的内存结构 3. 把数据存在值栈中,在页面上利用 ...
- MySQL InnoDB Engine--数据预热
##========================================##在MySQL 5.7版本中引入将Innodb Buffer中数据备份和回复的新特性,具体原理时将Buffer p ...
- C# 键盘响应事件及键值对照表
键盘响应事件总结 键盘响应事件是在用户按下某个键后触发的事件,可以是任意操作,但不是任意键都可以被捕获的. 原型:public event KeyPressEventHandler KeyPress ...
- oracle-pl/sql之一
http://www.cnblogs.com/huyong/archive/2011/05/10/2041951.html#_Toc15837 SQL语言只是访问.操作数据库的语言,并不是一种具有流程 ...
- 建立你第一个 Outlook Add-in
最近因为工作需要,研究了下Outlook Add-in 和 Graph API.下面带大家建立一个Hello World 项目 建立Add-in 先前需求: Node.js 使用cmd/PowerSh ...
- 配置zabbix当内存剩余不足15%的时候触发报警
zabbix默认的剩余内存报警:Average Lack of available memory on server {HOST.NAME}{Template OS Linux:vm.memory.s ...
- npm安装教程(vue.js)
https://www.cnblogs.com/goldlong/p/8027997.html 首先理清nodejs和npm的关系: node.js是javascript的一种运行环境,是对Googl ...
- JMeter之修改Sampler响应数据的编码格式
转 JMeter之修改Sampler响应数据的编码格式 问题:JMeter的sampler响应数据中有中文时,会解析出错. JMeter的Sampler中的响应数据默认的编码格式是:ISO-8859- ...
- mysql的变量信息详解
mysql的变量详解 执行show variables命令可以查看MySQL服务器的变量 变量名 默认值 说明 对应的配置文件参数 auto_increment_increment 1 自增长类型的初 ...