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端: 同步: 所谓同步,就 ...
随机推荐
- Maven的日常
强烈建议把 Maven 的 settings.xml 文件同时放在:%USER_HOME%/.m2/settings.xml 和${maven.home}/conf/settings.xml 两个地方 ...
- mvc 分页PagedList简单使用
1.nuget下载PagedList包 2.PageListHelper类: using PagedList; using System; using System.Collections.Gener ...
- Hive思维导图之Hive优化
- python面向对象--私有和继承
一. 私有属性和私有方法 应用场景 在实际开发中,对象的某些属性或方法可能只希望在对象的内部使用,而不希望在外部被访问到 私有属性 就是 对象 不希望公开的属性 (属性即类里面的变量) 私有方法 就是 ...
- struts2简单入门-Action的三种配置方式
普通的配置方式 优点:可读性高 缺点:重复的配置太多. 使用情况 一个actian只有一个方法,只需要处理一种请求. 代码演示 <action name="voteResult&quo ...
- 【译】第三篇 SQL Server安全主体和安全对象
本篇文章是SQL Server安全系列的第三篇,详细内容请参考原文. 一般来说,你通过给主体分配对象的权限来实现SQL Server上的用户与对象的安全.在这一系列,你会学习在SQL Server实例 ...
- 控件屏蔽Ctrl+C 复制
procedure ****.***KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin ) )) and (ssCtr ...
- Git命令执行漏洞
Git命令造成的反弹shell 漏洞描述: Git LFS可以.lfsconfig使用LFS由存储库中的文件配置(部分),并且可以将Git LFS指向ssh://. [lfs] url = ssh:/ ...
- oracle 索引的创建与使用
什么是数据库索引 在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快. 索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容. 对于数据库来说,索引是 ...
- volatile有什么作用