python select模块_Python下的select模块及方法解释

Python中有一个select模块,其中提供了:select、poll、epoll三个方法,分别调用系统的 select,poll,epoll 从而实现IO多路复用。

Windows Python:

提供: select

Mac Python:

提供: select

Linux Python:

提供: select、poll、epoll

注意:网络操作、文件操作、终端操作等均属于IO操作,对于windows只支持Socket操作,其他系统支持其他IO操作,但是无法检测 普通文件操作 自动上次读取是否已经变化。

对于select方法:

句柄列表11, 句柄列表22, 句柄列表33 = select.select(句柄序列1, 句柄序列2, 句柄序列3, 超时时间)

参数: 可接受四个参数(前三个必须)

返回值:三个列表

select方法用来监视文件句柄,如果句柄发生变化,则获取该句柄。

1、当 参数1 序列中的句柄发生可读时(accetp和read),则获取发生变化的句柄并添加到 返回值1 序列中

2、当 参数2 序列中含有句柄时,则将该序列中所有的句柄添加到 返回值2 序列中

3、当 参数3 序列中的句柄发生错误时,则将该发生错误的句柄添加到 返回值3 序列中

4、当 超时时间 未设置,则select会一直阻塞,直到监听的句柄发生变化

当 超时时间 = 1时,那么如果监听的句柄均无任何变化,则select会阻塞 1 秒,之后返回三个空列表,如果监听的句柄有变化,则直接执行。

利用select监听终端操作实例

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import select

import threading

import sys

while True:

readable, writeable, error = select.select([sys.stdin,],[],[],1)

if sys.stdin in readable:

print 'select get stdin',sys.stdin.readline()

利用select实现伪同时处理多个Socket客户端请求:服务端

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import socket

import select

sk1 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

sk1.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

sk1.bind(('127.0.0.1',8002))

sk1.listen(5)

sk1.setblocking(0)

inputs = [sk1,]

while True:

readable_list, writeable_list, error_list = select.select(inputs, [], inputs, 1)

for r in readable_list:

# 当客户端第一次连接服务端时

if sk1 == r:

print 'accept'

request, address = r.accept()

request.setblocking(0)

inputs.append(request)

# 当客户端连接上服务端之后,再次发送数据时

else:

received = r.recv(1024)

# 当正常接收客户端发送的数据时

if received:

print 'received data:', received

# 当客户端关闭程序时

else:

inputs.remove(r)

sk1.close()

利用select实现伪同时处理多个Socket客户端请求:客户端

#!/usr/bin/env python

# -*- coding:utf-8 -*-

import socket

ip_port = ('127.0.0.1',8002)

sk = socket.socket()

sk.connect(ip_port)

while True:

inp = raw_input('please input:')

sk.sendall(inp)

sk.close()

运行结果:

客户端输入

服务端接收

说明:

此处的Socket服务端相比与原生的Socket,他支持当某一个请求不再发送数据时,服务器端不会等待而是可以去处理其他请求的数据。但是,如果每个请求的耗时比较长时,select版本的服务器端也无法完成同时操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值