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()


运行结果:

客户端输入

wKioL1cQlluDMH-hAACLOJxGIxo633.png\"

服务端接收

wKiom1cQlcmhOrD1AACCR5usF1M425.png\"

说明:

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




      本文转自027ryan  51CTO博客,原文链接:http://blog.51cto.com/ucode/1764200,如需转载请自行联系原作者





相关文章
|
2月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
62 3
|
17天前
|
Python
Python Internet 模块
Python Internet 模块。
116 74
|
2月前
|
算法 数据安全/隐私保护 开发者
马特赛特旋转算法:Python的随机模块背后的力量
马特赛特旋转算法是Python `random`模块的核心,由松本真和西村拓士于1997年提出。它基于线性反馈移位寄存器,具有超长周期和高维均匀性,适用于模拟、密码学等领域。Python中通过设置种子值初始化状态数组,经状态更新和输出提取生成随机数,代码简单高效。
117 63
|
2月前
|
测试技术 Python
手动解决Python模块和包依赖冲突的具体步骤是什么?
需要注意的是,手动解决依赖冲突可能需要一定的时间和经验,并且需要谨慎操作,避免引入新的问题。在实际操作中,还可以结合使用其他方法,如虚拟环境等,来更好地管理和解决依赖冲突😉。
|
2月前
|
持续交付 Python
如何在Python中自动解决模块和包的依赖冲突?
完全自动解决所有依赖冲突可能并不总是可行,特别是在复杂的项目中。有时候仍然需要人工干预和判断。自动解决的方法主要是提供辅助和便捷,但不能完全替代人工的分析和决策😉。
|
24天前
|
安全
Python-打印99乘法表的两种方法
本文详细介绍了两种实现99乘法表的方法:使用`while`循环和`for`循环。每种方法都包括了步骤解析、代码演示及优缺点分析。文章旨在帮助编程初学者理解和掌握循环结构的应用,内容通俗易懂,适合编程新手阅读。博主表示欢迎读者反馈,共同进步。
|
1月前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
173 5
|
2月前
|
数据可视化 Python
如何在Python中解决模块和包的依赖冲突?
解决模块和包的依赖冲突需要综合运用多种方法,并且需要团队成员的共同努力和协作。通过合理的管理和解决冲突,可以提高项目的稳定性和可扩展性
|
8月前
|
Python 人工智能 数据可视化
Python模块与包(八)
Python模块与包(八)
60 0
Python模块与包(八)
|
2月前
|
开发者 Python
如何在Python中管理模块和包的依赖关系?
在实际开发中,通常会结合多种方法来管理模块和包的依赖关系,以确保项目的顺利进行和可维护性。同时,要及时更新和解决依赖冲突等问题,以保证代码的稳定性和可靠性
55 4