加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

IO多路复用之selectors模块

发布时间:2020-12-17 17:00:11 所属栏目:Python 来源:网络整理
导读:此模块允许高级和高效的I / O多路复用,建立在选择模块基元上。 鼓励用户使用此模块,除非他们需要精确控制所使用的操作系统级原语。 selectors的DefaultSelector会自动选择所在平台最高效的实现,顺序是:epoll,poll,select。 注意: ????????selectors是

此模块允许高级和高效的I / O多路复用,建立在选择模块基元上。 鼓励用户使用此模块,除非他们需要精确控制所使用的操作系统级原语。

selectors的DefaultSelector会自动选择所在平台最高效的实现,顺序是:epoll,poll,select。

注意:

????????selectors是python3.4才新增的

一个简单的selectors客户端代码示例:

import?selectors
import?socket

ip_port?=?("127.0.0.1",?8079)
back_log?=?5
buffer_size?=?1024


class?SelectServer:
????def?__init__(self):
????????#?根据电脑系统默认优先选择epoll,poll,select顺序
????????self.sel?=?selectors.DefaultSelector()
????????self.creta_socket()
????????self.handle()

????def?creta_socket(self):
????????sel_server?=?socket.socket()
????????sel_server.bind(ip_port)
????????sel_server.listen(back_log)
????????#?禁止IO阻塞
????????sel_server.setblocking(False)
????????self.sel.register(sel_server,?selectors.EVENT_READ,?self.accept)
????????print("服务端已开启,等待用户连接")

????def?handle(self):
????????while?True:
????????????events?=?self.sel.select()
????????????for?key,?mask?in?events:
????????????????print("key",?key,?"nmask",?mask)
????????????????callback?=?key.data?#?函数内存
????????????????callback(key.fileobj,?mask)

????def?accept(self,?sock,?mask):
????????#?准备连接
????????conn,?addr?=?sock.accept()
????????print("accept?",?conn,?"from",?addr)
????????conn.setblocking(False)
????????self.sel.register(conn,?self.read)

????def?read(self,?mask):
????????try:
????????????#?接受数据
????????????data?=?conn.recv(buffer_size)
????????????if?data:
????????????????print(repr(data),?"to",?conn)
????????????????conn.sendall(data)
????????????else:
????????????????print("closing?",?conn)
????????????????self.sel.unregister(conn)
????????????????conn.close()
????????except?ConnectionResetError:
????????????self.sel.unregister(conn)
????????????conn.close()

if?__name__?==?'__main__':
????SelectServer()

seletors客户端代码示例:

import?socket

ip_port?=?("127.0.0.1",?8079)
buffer_size?=?1024


class?SelectClient:
????def?__init__(self):
????????self.create_socket()
????????self.run()

????def?create_socket(self):
????????self.s_client?=?socket.socket()
????????self.s_client.connect(ip_port)

????def?run(self):
????????while?True:
????????????data?=?input(">>>")
????????????self.s_client.send(bytes(data,?"utf8"))
????????????print(str(self.s_client.recv(buffer_size),"utf-8"))

if?__name__?==?'__main__':
????SelectClient()


(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读