Python通过select实现异步IO的方法


Posted in Python onJune 04, 2015

本文实例讲述了Python通过select实现异步IO的方法。分享给大家供大家参考。具体如下:

在Python中使用select与poll比起在C中使用简单得多。select函数的参数是3个列表,包含整数文件描述符,或者带有可返回文件描述符的fileno()方法对象。第一个参数是需要等待输入的对象,第二个指定等待输出的对象,第三个参数指定异常情况的对象。第四个参数则为设置超时时间,是一个浮点数。指定以秒为单位的超时值。select函数将会返回一组文件描述符,包括输入,输出以及异常。

在linux下利用select实现多路IO的文件复制程序:

#!/usr/bin/env python
import select
#导入select模块
BLKSIZE=8192
def readwrite(fromfd,tofd):
  readbuf = fromfd.read(BLKSIZE)
  if readbuf:
    tofd.write(readbuf)
    tofd.flush()
  return len(readbuf)
def copy2file(fromfd1,tofd1,fromfd2,tofd2):
    ''' using select to choice fds'''
  totalbytes=0
    if not (fromfd1 or fromfd2 or tofd1 or tofd2) :
 #检查所有文件描述符是否合法
        return 0
  while True:
 #开始利用select对输入所有输入的文件描述符进行监视
    rs,ws,es = select.select([fromfd1,fromfd2],[],[])
    for r in rs:
      if r is fromfd1:
 #当第一个文件描述符可读时,读入数据
        bytesread = readwrite(fromfd1,tofd1)      
        totalbytes += bytesread
      if r is fromfd2:
        bytesread = readwrite(fromfd2,tofd2)
        totalbytes += bytesread
    if (bytesread <= 0):
      break
  return totalbytes
def main():
  fromfd1 = open("/etc/fstab","r")
  fromfd2 = open("/etc/passwd","r")
  tofd1 = open("/root/fstab","w+")
  tofd2 = open("/root/passwd","w+")
  totalbytes = copy2file(fromfd1,tofd1,fromfd2,tofd2)
  print "Number of bytes copied %d\n" % totalbytes
  return 0
if __name__=="__main__":
  main()

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python实现分割文件及合并文件的方法
Jul 10 Python
详解python的数字类型变量与其方法
Nov 20 Python
深入浅析Python2.x和3.x版本的主要区别
Nov 30 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
Sep 07 Python
python如何通过pyqt5实现进度条
Jan 20 Python
python安装后的目录在哪里
Jun 21 Python
Python定时任务APScheduler安装及使用解析
Aug 07 Python
Sentry错误日志监控使用方法解析
Nov 12 Python
python time.strptime格式化实例详解
Feb 03 Python
python实现简单区块链结构
Apr 25 Python
这样写python注释让代码更加的优雅
Jun 02 Python
Python守护进程用法实例分析
Jun 04 #Python
Python使用multiprocessing创建进程的方法
Jun 04 #Python
python在windows下创建隐藏窗口子进程的方法
Jun 04 #Python
python实现支持目录FTP上传下载文件的方法
Jun 03 #Python
python实现的DES加密算法和3DES加密算法实例
Jun 03 #Python
python获取各操作系统硬件信息的方法
Jun 03 #Python
wxPython定时器wx.Timer简单应用实例
Jun 03 #Python
You might like
PHP制作用户注册系统
2015/10/23 PHP
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
js实现广告漂浮效果的小例子
2013/07/02 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
如何使用AngularJs打造权限管理系统【简易型】
2016/05/09 Javascript
jQuery 更改checkbox的状态,无效的解决方法
2016/07/22 Javascript
基于jQuery实现中英文切换导航条效果
2016/09/18 Javascript
javascript鼠标跟随运动3种效果(眼球效果,苹果菜单,方向跟随)
2016/10/27 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
js实现简单的打印表格
2020/01/15 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
利用webpack理解CommonJS和ES Modules的差异区别
2020/06/16 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
用python实现批量重命名文件的代码
2012/05/25 Python
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
python Tkinter版学生管理系统
2019/02/20 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
Django app配置多个数据库代码实例
2019/12/17 Python
pytorch实现mnist分类的示例讲解
2020/01/10 Python
python动态文本进度条的实例代码
2020/01/22 Python
浅析Python面向对象编程
2020/07/10 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
Html5内唤醒百度、高德APP的实现示例
2019/05/20 HTML / CSS
年会搞笑主持词串词
2014/03/24 职场文书
校运动会广播稿(100篇)
2014/09/12 职场文书
特此通知格式
2015/04/27 职场文书
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
2021/05/21 Redis
Vue3.0 手写放大镜效果
2021/07/25 Vue.js
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL