利用队列Queue实现一个多并发“线程池”效果的Socket程序
本例通过利用类Queue建立了一个存放着Thread对象的“容器对象”,当Client端申请与Server端通信时,在Server端的“链接循环”中每次拿出一个Thread对象去创建“线程链接”,从而实现了多个客户端同时与服务器端通信的效果,代码如下:
# -*- coding: utf-8 -*-
# -*- Author: WangHW -*-
import socket
from threading import Thread
import mythread 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 = pool.get_thread()
#使用线程对象创建线程
obj = t(target=Communication, args=(conn,))
obj.start() # 启动线程 if __name__ == '__main__':
pool = mythread.MyThread(3)
#主线程干Server的工作
Server('127.0.0.1',9001)
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',9001)) 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
新建一个mythread.py文件,专门进行队列的操作:
# -*- coding: utf-8 -*-
# -*- Author: WangHW -*-
from threading import Thread
from queue import Queue
class MyThread:
def __init__(self,maxthread):
self.maxthread = maxthread
#初始化一个Queue对象
self.q = self.queue =Queue(maxthread)
#在队列中存放maxthread个对象,起到线程池的作用
for i in range(maxthread):
self.q.put(Thread) def put_thread(self):
'''put'''
self.q.put(Thread) def get_thread(self):
'''get'''
return self.q.get()
mythread
如果设置最大的并发数为3,所以只能同时有3个客户端与服务器端通信:

利用队列Queue实现一个多并发“线程池”效果的Socket程序的更多相关文章
- Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)
Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...
- (C#)使用队列(Queue)解决简单的并发问题
(C#)使用队列(Queue)解决简单的并发问题 2015-07-16 13:04 13265人阅读 评论(8) 收藏 举报 分类: Asp.Net(8) 版权声明:本文为博主原创文章,未经博主允 ...
- Java并发--线程池的使用
在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统 ...
- Java并发——线程池Executor框架
线程池 无限制的创建线程 若采用"为每个任务分配一个线程"的方式会存在一些缺陷,尤其是当需要创建大量线程时: 线程生命周期的开销非常高 资源消耗 稳定性 引入线程池 任务是一组逻辑 ...
- ExecutorService 建立一个多线程的线程池的步骤
ExecutorService 建立一个多线程的线程池的步骤: 线程池的作用: 线程池功能是限制在系统中运行的线程数. 依据系统的环境情况,能够自己主动或手动设置线程数量.达到执行的最佳效果:少了浪费 ...
- Java并发——线程池原理
"池"技术对我们来说是非常熟悉的一个概念,它的引入是为了在某些场景下提高系统某些关键节点性能,最典型的例子就是数据库连接池,JDBC是一种服务供应接口(SPI),具体的数据库连接实 ...
- Java高并发 -- 线程池
Java高并发 -- 线程池 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. ...
- 基于无锁队列和c++11的高性能线程池
基于无锁队列和c++11的高性能线程池线程使用c++11库和线程池之间的消息通讯使用一个简单的无锁消息队列适用于linux平台,gcc 4.6以上 标签: <无> 代码片段(6)[ ...
- Java并发—线程池框架Executor总结(转载)
为什么引入Executor线程池框架 new Thread()的缺点 每次new Thread()耗费性能 调用new Thread()创建的线程缺乏管理,被称为野线程,而且可以无限制创建,之间相互竞 ...
随机推荐
- linux下寻找段错误的方法
为了能够快速找到发生段错误的地方,记录以下两种方法. objdump和backtrace的配合使用 :https://www.cnblogs.com/jiangyibo/p/9507555.html ...
- string的方法find
官方解释:find(sub[, start[, end]]) Return the lowest index in the string where substring sub is found wi ...
- zsh:no matches found 问题解决
解决方法: ~/.zshrc 文件加入: setopt no_nomatch 之后,更新配置 source ~/.zshrc
- vscode vue eslint 快捷键格式化代码
添加vetur , eslint插件 在工作区添加以下代码 "workbench.startupEditor": "welcomePage", &quo ...
- Web 前端面试小知识
简历投递 前期为了解自身短板, 可以海投一些试试. 不建议长期海投简历, 对用人单位简历筛选和你自身都没什么好处. 投简历之前最起码要关注以下几点(薪资范围, 公司位置, 职位要求, 是否为培训机构冒 ...
- java-shiro登录验证
登录验证: LoginController:(LoginController.java) @ResponseBody @RequestMapping(value="/login", ...
- py-day1-4 python基本数据类型2
# replace 替换 text = 'xiaomafafafahaoyunlianlian' v = text.replace('fa','shun') x = text.replace('fa' ...
- Redis 键命令
1.设置key值 set name zhangsan 删除key del name 2. 判断key是否存在 exists a,返回1 说明存在: 0 表示不存在 3. 剩余过期时间 ttl 返回- ...
- MapReduce案例:统计共同好友+订单表多表合并+求每个订单中最贵的商品
案例三: 统计共同好友 任务需求: 如下的文本, A:B,C,D,F,E,OB:A,C,E,KC:F,A,D,ID:A,E,F,LE:B,C,D,M,LF:A,B,C,D,E,O,MG:A,C,D,E ...
- Java MyBatis insert数据库数据后返回主键
<selectKey keyProperty="id" resultType="java.lang.Long" order="AFTER&quo ...