前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >并发篇-python非阻塞套接字-3

并发篇-python非阻塞套接字-3

作者头像
小团子
发布2019-07-18 10:57:16
5740
发布2019-07-18 10:57:16
举报
文章被收录于专栏:数据云团数据云团

也知道了 epoll

目前 Linux 上效率最高的 IO多路复用 技术 !

那怎么使用 epoll

> IO多路复用选择器

# 实例化一个 epoll 选择器

>>>selector = selectors.DefaultSelector()

# 删除注册事件

>>>selector.unregister(connection)

# 定义一个回调函数

>>>def accept(server):

# 设置成非阻塞

>>>connection.setblocking(False)

# 处理消息的函数注册

>>>selector.register(connection, selectors.EVENT_READ, read)

#把监听套接字和生成对等套接字的函数注册到read事件(有用户连接)

>>>selector.register(server, selectors.EVENT_READ, accept)

# 查询,返回所有已经准备好资源的打包对象

>>>events = selector.select()

# 回掉函数

>>>callback = key.data

# 连接客户端的套接字

>>>sock = key.fileobj

# 不需要关心是什么套接字,什么事件,只需要调用对应的回调函数即可

>>>callback(sock)

基本思路

>先在指定的套接字上注册对应的事件及回调;

>不断的查询所有已经准备好资源的套接字;

>不需要考虑套接字与事件只管调用。

### 阻塞 VS 非阻塞

阻塞IO:

- 在1、2阶段都发生阻塞; - 调用阻塞IO会一直block住进程,直到操作完成

非阻塞IO:

- 在第1阶段没有阻塞,在第2阶段发生阻塞; - 当用户进程发出IO请求时, 如果内核中的数据还没由准备好,那么它并不会block用户进程,而是立即返回一个错误, 在程序看来,它发起一个请求后,并不需要等待,而是马上就得到一个结果。 - 非阻塞IO需要不断轮询,查看数据是否已经准备好了;

阻塞与非阻塞可以简单理解为调用一个IO操作能不能立即得到返回应答,如果不能立即获得返回,需要等待,那就阻塞了;否则就可以理解为非阻塞 。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档