在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)的更多相关文章

  1. python 并发编程 非阻塞IO模型

    非阻塞IO(non-blocking IO) Linux下,可以通过设置socket使其变为non-blocking.当对一个non-blocking socket执行读操作时,流程是这个样子: 从图 ...

  2. Python并发编程之同步\异步and阻塞\非阻塞

    一.什么是进程 进程: 正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 进程和程序的区别: 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程. 需要强调的是:同一个程序执行两次,那也 ...

  3. Python之路(第三十六篇)并发编程:进程、同步异步、阻塞非阻塞

    一.理论基础 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的. 即使可以利用的cpu只有一个(早期的 ...

  4. {Python之进程} 背景知识 什么是进程 进程调度 并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 multiprocess模块 进程池和mutiprocess.Poll

    Python之进程 进程 本节目录 一 背景知识 二 什么是进程 三 进程调度 四 并发与并行 五 同步\异步\阻塞\非阻塞 六 进程的创建与结束 七 multiprocess模块 八 进程池和mut ...

  5. Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程

    1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...

  6. Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就绪,挂起,运行) ,***协程概念,yield模拟并发(有缺陷),Greenlet模块(手动切换),Gevent(协程并发)

    Python进阶----异步同步,阻塞非阻塞,线程池(进程池)的异步+回调机制实行并发, 线程队列(Queue, LifoQueue,PriorityQueue), 事件Event,线程的三个状态(就 ...

  7. python并发编程之IO模型 同步 异步 阻塞 非阻塞

    IO浅谈 首先 我们在谈及IO模型的时候,就必须要引入一个“操作系统”级别的调度者-系统内核(kernel),而阻塞非阻塞是跟进程/线程严密相关的,而进程/线程又是依赖于操作系统存在的,所以自然不能脱 ...

  8. python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)

    9.11 进程池与线程池 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 池子内什么时候装进程:并发的任务属于计算密集型 池子内什么时候装线程:并发的任务属于I ...

  9. python 并发编程 操作系统 进程 并发.并行 及 同步/异步,阻塞/非阻塞

    操作系统: 多道技术背景: 提高工作效率(充分利用IO阻塞的时间) 同时执行多个任务 多道技术 空间复用:充分的利用内存空间 时间复用:充分利用IO阻塞时间 分时系统: 并发:提高了程序的工作效率 两 ...

  10. Python番外之 阻塞非阻塞,同步与异步,i/o模型

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就 ...

随机推荐

  1. glide:4.7.1 与 26.1.0冲突

    implementation 'com.android.support:support-v4:26.1.0'implementation 'com.github.bumptech.glide:glid ...

  2. asp.net网页注释

    asp.net页面上有一个asp控件,结果 使用<!-- -->注释不起作用,最后发现使用<%-- --%>注释可以.

  3. 三十四、Linux 进程与信号——信号特点、信号集和信号屏蔽函数

    34.1 信号特点 信号的发生是随机的,但信号在何种条件下发生是可预测的 进程杠开始启动时,所有信号的处理方式要么默认,要么忽略:忽略是 SIGUSR1 和 SIGUSR2 两个信号,其他都采取默认方 ...

  4. Docker 创建 mongo 容器

    获取 docker 认证 mongo 镜像: docker pull mongo 创建运行 mongo 容器: docker run -d -it -p : --name mongo3 -m 512M ...

  5. article2pdf (Wordpress plug-in) Multiple vulnerabilities(CVE-2019-1000031, CVE-2019-1010257)

    Product: article2pdf (Wordpress plug-in)Product Website: https://wordpress.org/plugins/article2pdf/A ...

  6. 第25月第22日 django channels

    1. https://github.com/andrewgodwin/channels-examples/ https://channels.readthedocs.io/en/latest/

  7. 牛客寒假算法基础集训营4 G(最小生成树)

    题目链接 题目要求的是得到k种不同的元素,(题解)将每种类型视为一个点,跑一边克鲁斯卡尔即可. #include <set> #include <map> #include & ...

  8. JDK1.8源码分析之Comparable && Comparator

    import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util. ...

  9. 【blog】推荐一个博客系统后台管理模板 - pinghsu

    pinghsu https://github.com/chakhsu/pinghsu

  10. python - beautifulsoup4模块

    # beautifulsoup4学习 # 是一个python模块 用于接受一个HTML 或 XML 字符串,然后将其进行格式化,之后便可以使用模块提供的方法进行快速查找指定元素, # 从而是的在HTM ...