selector

来源:互联网 发布:java 自行车 编辑:程序博客网 时间:2024/06/10 21:23

背景:

selector模块将select,poll,epoll模块进行了封装,epoll效率最高,默认调用epoll

windows只支持select,底层根据系统支持自动选择

import selectorsimport socketsel = selectors.DefaultSelector()def listen_conn_function(conn, mask):    conn.sendall(conn.recv(1024))def listen_server_function(server, mask):    sel.register(server.accept()[0], selectors.EVENT_READ, listen_conn_function)host = 'localhost'port = 10086address = host, portserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.bind(address)server.listen()sel.register(server, selectors.EVENT_READ, listen_server_function)while True:    events = sel.select()    for key, mask in events:        key.data(key.fileobj, mask)


selector自动实现监听和处理操作,只需要设置一下监听管理,监听对象和监听操作即可

监听管理:

sel = selectors.DefaultSelector()
获取监听管理对象,监听方式底层自动选择

注册监听:

sel.register(server, selectors.EVENT_READ, listen_server_function)
通过注册,把监听对象和监听操作交给监听对象管理,监听管理对象自动管理,实现监听并操作

监听执行:

events = sel.select()for key, mask in events:    key.data(key.fileobj, mask)
阻塞并获取信息,调用监听绑定方法和监听对象执行操作


监听管理者信息:

regiester:

    注册监听,传入的参数分别是监听对象,监听类型,监听执行方法

unregiester:

    注销监听,传入已监听对象即可

select:

    开始阻塞,直到监听对象活跃

key:

    监听事件,包含监听对象和监听方法

key.data:

    监听事件绑定数据,即监听操作

key.fileobj:

    监听事件的监听对象


操作流程:

准备监听管理对象:

    创建监听管理对象,所有事件交由它进行监听并处理

准备监听对象:

    创建监听对象,监听对象可以任意,只要能进行激活,可以被监听,一般是IO操作对象

准备监听方法:

    入参包含监听对象,定义操作方法,在监听对象进入活跃状态时执行操作,包括注销监听

注册监听事件:

    通过注册,把监听对象和操作绑定,组合成监听事件交由监听管理对象进行管理,自动监听和执行操作

监听事件执行:

    外部阻塞,获取监听事件信息,命令事件执行


程序员任务:

数据的准备:

    准备物料,让任务就绪

流程的规划:

    排布任务,指定流程

时机的掌控:

    把握大局,掌控任务的阻塞和执行,不在忙碌于具体细节