python并发(阻塞、非阻塞、epoll)
在Linux系统中
01 阻塞服务端
特征:1对1,阻塞。
import socket server = socket.socket() #生成套接字对象
server.bind(('0.0.0.0', 8000)) #套接字绑定ip和端口,变为监听套接字
server.listen(5) #开始监听 while True:
conn, addr = server.accept() #建立连接,生成对等套接字
print('用户连接:', addr)
while True:
try:
data = conn.recv(1024)
if data == b'Q' or data == b'q':
print('用户退出:', addr)
break
else:
print('收到的消息:', data.decode())
conn.send(data)
except Exception as e:
print(e)
conn.close()
break
02 非阻塞服务端
特征:1对多,轮询,非阻塞,占用资源多。
import socket server = socket.socket() #创建套接字
server.setblocking(False) #把套接字设置为非阻塞
server.bind(('0.0.0.0', 8001)) #绑定IP和端口
server.listen(5) #监听端口 all_connection = [] #保存已经连接的客户
while True:
#只管连接的事情
try:
conn, addr = server.accept() # 建立连接,没有就抛出异常
conn.setblocking(False) #设置非阻塞
print('用户连接:', addr)
all_connection.append(conn)
except Exception as e:
pass #处理已经连接用户的消息
handle = all_connection.copy() #完全拷贝了列表
for connection in handle:
try:
recv_data = connection.recv(1024)
if recv_data:
print(recv_data.decode())
connection.send(recv_data)
else: #客户端消息处理完了,已经断开了连接
print('断开连接', connection)
connection.close()
all_connection.remove(connection) #从客户列表里移除断开连接的客户
except Exception as e:
pass
03 epoll服务端
特征:1对多,通知机制,非阻塞,占用资源少;
epoll:注册惰性事件回调。
import selectors #调用epoll的模块
import socket epoll = selectors.EpollSelector() #生成一个epoll
server = socket.socket() #生成套接字
server.bind(('', 8082)) #参数1‘’与‘0.0.0.0’等价,表示ip都可接入
server.listen(100) #回调函数
def create_conneciton(server):
#百分百有人连接,不会阻塞
conn, addres = server.accept() #生成对等连接套接字 #处理消息的函数注册
epoll.register(conn, selectors.EVENT_READ, read_data)
return conn #回调函数 处理消息
def read_data(conn): data = conn.recv(1024)
if data:
print(data)
conn.send(data)
else:
epoll.unregister(conn) #删掉注册事件 #
#把监听套接字和生成对等套接字的函数注册到read事件(有用户连接)
epoll.register(server, selectors.EVENT_READ, create_conneciton) #
while True: #事件循环
events = epoll.select() #去操作系统查询 for key,mask in events:
sock = key.fileobj #连接客户端的套接字
callback = key.data #回调函数 #read_data(conn), create_conneciton(server)
callback(sock) #调用函数
04 客户端
测试服务端。
import socket client = socket.socket()
client.connect(('127.0.0.1', 8082)) while True:
data = input('输入数据:')
client.send(data.encode())
recv_data = client.recv(1024)
print(recv_data.decode())
python并发(阻塞、非阻塞、epoll)的更多相关文章
- python 并发编程 非阻塞IO模型
非阻塞IO(non-blocking IO) Linux下,可以通过设置socket使其变为non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图 ...
- Python并发编程之同步\异步and阻塞\非阻塞
一.什么是进程 进程: 正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 进程和程序的区别: 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程. 需要强调的是:同一个程序执行两次,那也 ...
- Python之路(第三十六篇)并发编程:进程、同步异步、阻塞非阻塞
一.理论基础 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的. 即使可以利用的cpu只有一个(早期的 ...
- {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll
Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...
- Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程
1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...
- Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)
Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...
- python并发编程之IO模型 同步 异步 阻塞 非阻塞
IO浅谈 首先 我们在谈及IO模型的时候,就必须要引入一个“操作系统”级别的调度者-系统内核(kernel),而阻塞非阻塞是跟进程/线程严密相关的,而进程/线程又是依赖于操作系统存在的,所以自然不能脱 ...
- python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)
9.11 进程池与线程池 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 池子内什么时候装进程:并发的任务属于计算密集型 池子内什么时候装线程:并发的任务属于I ...
- python 并发编程 操作系统 进程 并发.并行 及 同步/异步,阻塞/非阻塞
操作系统: 多道技术背景: 提高工作效率(充分利用IO阻塞的时间) 同时执行多个任务 多道技术 空间复用:充分的利用内存空间 时间复用:充分利用IO阻塞时间 分时系统: 并发:提高了程序的工作效率 两 ...
- Python番外之 阻塞非阻塞,同步与异步,i/o模型
1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步: 所谓同步,就 ...
随机推荐
- [Windows] [DLL] [动态链接库技术]
cppblog.com 天空的博客 http://www.cppblog.com/API/archive/2011/03/10/141506.html cnblogs.com 吴秦的博客 http:/ ...
- JDK源码之ArrayList
序言 ArrayList底层通过数组实现. ArrayList即动态数组,实现了动态的添加和减少元素 需要注意的是,容量拓展,是创建一个新的数组,然后将旧数组上的数组copy到新数组,这是一个很大的消 ...
- 【十一】jvm 性能调优工具之 jmap
jvm 性能调优工具之 jmap 概述 命令jmap是一个多功能的命令.它可以生成 java 程序的 dump 文件, 也可以查看堆内对象示例的统计信息.查看 ClassLoader 的信息以及 fi ...
- Groovy&开发环境
Jenkinsfile开发语言 -- Groovy http://www.groovy-lang.org/ A multi-faceted language for the Java platform ...
- Linux之Ubuntu添加/移除个人软件包存档的源[PPA,Personal Package Archives]
现在很多第三方软件还需要添加PPA软件源到Ubuntu系统当中,但是添加了PPA之后,软件可以直接在软件中心进行安装并会自动提示升级,这就是Ubuntu带来的方便,现在我们就来看看如何添加PPA软件源 ...
- Web前端性能优化常见面试题
一般说来,web前端指网站业务逻辑之前的部分,包括浏览器加载.网站视图模型.图片服务.CDN服务等,主要优化手段有浏览器访问.使用反向代理才.CDN等.1.减少http请求,合理浏览器缓存 2.启用压 ...
- 前端面试(二):N轮面试
一面 在一面中要掌握什么技巧,主要考察前端开发的基础知识 1.面试技巧.页面布局类 页面布局小结: 语义化掌握到位 页面布局理解深刻 CSS基础知识扎实 思维灵活且积极上进 代码书写规范 2.CSS盒 ...
- day 4 - 1 列表
1.列表的增删改查 1) append insert extend li = ["ysg",[1,2,3,4,5],"peipei","梦幻" ...
- bzoj3262: 陌上花开(CDQ+树状数组处理三维偏序问题)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3262 题目大意:中文题目 具体思路:CDQ可以处理的问题,一共有三维空间,对于第一维我们 ...
- 转:Java项目开发规范参考
Java项目开发规范参考 - KevinLee的博客 - 博客频道 - CSDN.NEThttp://blog.csdn.net/u011383131/article/details/51227860 ...