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版本的服务器端也无法完成同时操作。

时间: 2024-10-19 23:37:06

Python下的select模块及方法解释的相关文章

Python——IO多路复用之select模块epoll方法

Python——IO多路复用之select模块epoll方法 使用epoll方法实现IO多路复用,使用方法基本与poll方法一致,epoll效率要高于select和poll. .├── epoll_client.py├── epoll_server.py└── settings.py # settings.py HOST = 'localhost' PORT = 5555 buffersize = 1024 ADDR = HOST, PORT # poll_server.py from sett

python中的select模块

介绍: Python中的select模块专注于I/O多路复用,提供了select  poll  epoll三个方法(其中后两个在Linux中可用,windows仅支持select),另外也提供了kqueue方法(freeBSD系统) select方法: 进程指定内核监听哪些文件描述符(最多监听1024个fd)的哪些事件,当没有文件描述符事件发生时,进程被阻塞:当一个或者多个文件描述符事件发生时,进程被唤醒. 当我们调用select()时: 1 上下文切换转换为内核态 2 将fd从用户空间复制到内

Python下探究随机数的产生方法

资源下载 #本文PDF版下载 Python下探究随机数的产生方法(或者单击我博客园右上角的github小标,找到lab102的W7目录下即可) #本文代码下载 几种随机数算法集合(和下文出现过的相同) 前言 我们对于随机数肯定不会陌生,随机数早已成为了我们经常要用到的一个方法,比如用于密码加密,数据生成,蒙特卡洛算法等等都需要随机数的参与.那么我们的电脑是怎么才能够产生随机数的呢?是电脑自己的物理存在还是依靠算法?它到底是如何工作的呢?所以我也对这些问题有着好奇心,所以找到了许多资料学习了一下,

python下通过os模块和shutil模块进行文件处理方式

python下通过os模块和shutil模块进行文件处理方式 得到当前工作目录路径:os.getcwd() 获取指定目录下的所有文件和目录名:os.listdir(dir) 删除文件:os.remove(file) 删除多个目录:os.removedirs(r"/home") 检测路径是否为文件:os.path.isfile(path) 检测路径是否为目录:os.path.isdir(path) 判断是否为绝对路径:os.path.isabs(path) 检测路径是否存在:os.pat

【Python基础】之三个文件在不同目录下导入指定模块的方法

如下图三个文件的目录路径 – project     |–  1     |    |–  2     |    |    |–  3    |    |    |    |– owen.py     |–  A     |    |–  test.py    |    |–  B    |    |    |–  C    |    |    |    |– et.py 说明:owen.py是class A(): et.py继承class B(A);    test.py通过et.py调用ow

python下输出指定年月日的方法之一

参考自:http://www.cnblogs.com/rollenholt/archive/2012/04/11/2441699.html 格式字符串 datetime.date.time都提供了strftime()方法,该方法接收一个格式字符串,输出日期时间的字符串表示. 下表是从python手册中拉过来的,我对些进行了简单的翻译. 格式字符  意义 %a星期的简写.如 星期三为Web %A星期的全写.如 星期三为Wednesday %b月份的简写.如4月份为Apr %B月份的全写.如4月份为

Python下使用Psyco模块优化运行速度

今天介绍下Psyco模块,Psyco模块可以使你的Python程序运行的像C语言一样快.都说Python语言易用易学,但性能上跟一些编译语言(如C语言)比较要差不少,这里可以用C语言和Python语言各编写斐波纳契数列计算程序,并计算运行时间: C语言程序 复制代码代码如下: int fib(int n){   if (n < 2)     return n;   else     return fib(n - 1) + fib(n - 2);} int main() {    fib(40);

Python IO多路复用select模块

多路复用的分析实例:服务端.客户端 #服务端配置 from socket import * import time import select server = socket(AF_INET, SOCK_STREAM) server.bind(('127.0.0.1',8080)) server.listen(5) server.setblocking(False) ''' select/epoll的优势并不是对于单个连接能处理得更快,而是在于能处理更多的连接. 当任何一个socket中的数据准

python下安装mysql模块失败

fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory http://www.codegood.com/downloads