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


Posted in Python onJune 04, 2015

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

在使用poll()后返回轮询对象,该对象支持以下方法:
pollObj.register(fd,[,eventmask])第一个参数是注册新的文件描述符fd,fd要么是一个整数文件描述符,要么可以带有一个获取文件描述符的fileno()方法的对象。eventmask是一些按位或标记,这些标记指示要处理的事件。

POLLIN:       用于读取数据
POLLPRI:      用于读取紧急数据
POLLOUT:      准备写入
POLLERR:      错误情况
POLLHUP:      保持状态
POLLNVAL:     无效请求

最后在循环中利用pollObj.poll()来进行对已注册的文件描述符进行轮询。返回一元祖(fd,event)。其中fd是文件描述符,event是指示时间的位掩码。至需要将event与对应的时间进行&测试即可。

利用poll创建对一个多路文件复制程序,代码如下:

#!/usr/bin/env python
import select
BLKSIZE=8192
def readwrite(fromfd,tofd):
  readbuf = fromfd.read(BLKSIZE)
  if readbuf:
    tofd.write(readbuf)
    tofd.flush()
  return len(readbuf)
def copyPoll(fromfd1,tofd1,fromfd2,tofd2):
  #定义需要监听的事件
  READ_ONLY = (select.POLLIN |
       select.POLLPRI |
      select.POLLHUP |
      select.POLLERR )
  totalbytes=0
    if not (fromfd1 or fromfd2 or tofd1 or tofd2) :
    return 0
  fd_dict = {fromfd1.fileno():fromfd1,fromfd2.fileno():fromfd2}
  #创建poll对象p
  p=select.poll()
  #利用poll对象p对需要监视的文件描述符进行注册
  p.register(fromfd1,READ_ONLY)
  p.register(fromfd2,READ_ONLY)
  while True:
  #轮询已经注册的文件描述符是否已经准备好
    result = p.poll()
    if len(result) != 0:
      for fd,events in result:
        if fd_dict[fd] is fromfd1:
          if events & (select.POLLIN|select.POLLPRI):
            bytesread = readwrite(fromfd1,tofd1)
            totalbytes+=bytesread
          elif events & (select.POLLERR):
            p.unregister(fd_dict[fd])
        if fd_dict[fd] is fromfd2:
          if events & (select.POLLIN|select.POLLPRI):
            bytesread = readwrite(fromfd2,tofd2)
            totalbytes+=bytesread
          elif events & (select.POLLERR):
            p.unregister(fd_dict[fd])
    if bytesread <= 0:  
      break
  return totalbytes
def main():
  fromfd1 = open("/etc/fstab","r")
  fromfd2 = open("/root/VMwareTools-8.8.1-528969.tar.gz","r")
  tofd1 = open("/root/fstab","w+")
  tofd2 = open("/var/passwd","w+")
  totalbytes = copyPoll(fromfd1,tofd1,fromfd2,tofd2)
  print "Number of bytes copied %d\n" % totalbytes
  return 0
if __name__=="__main__":
  main()

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

Python 相关文章推荐
Python 匹配任意字符(包括换行符)的正则表达式写法
Oct 29 Python
python实现简单爬虫功能的示例
Oct 24 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
Jan 18 Python
Django实现自定义404,500页面教程
Mar 26 Python
Python使用matplotlib简单绘图示例
Feb 01 Python
python使用matplotlib画饼状图
Sep 25 Python
Python补齐字符串长度的实例
Nov 15 Python
python 判断矩阵中每行非零个数的方法
Jan 26 Python
python抓取需要扫微信登陆页面
Apr 29 Python
Python读取配置文件(config.ini)以及写入配置文件
Apr 08 Python
Python爬虫:Request Payload和Form Data的简单区别说明
Apr 30 Python
python动态规划算法实例详解
Nov 22 Python
Python通过select实现异步IO的方法
Jun 04 #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
You might like
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
Yii 框架入口脚本示例分析
2020/05/19 PHP
Prototype使用指南之hash.js
2007/01/10 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
AngularJS 中的指令实践开发指南(一)
2016/03/20 Javascript
Javascript随机标签云代码实例
2016/06/21 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
Vue CLI3移动端适配(px2rem或postcss-plugin-px2rem)
2020/04/27 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
使用wxpython实现的一个简单图片浏览器实例
2014/07/10 Python
从Python程序中访问Java类的简单示例
2015/04/20 Python
python实现按任意键继续执行程序
2016/12/30 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
Python 实现字符串中指定位置插入一个字符
2018/05/02 Python
python 实现登录网页的操作方法
2018/05/11 Python
python2 与 python3 实现共存的方法
2018/07/12 Python
Django重置migrations文件的方法步骤
2019/05/01 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
python3.4中清屏的处理方法
2020/07/06 Python
用Python实现职工信息管理系统
2020/12/30 Python
医药专业应届毕业生求职信范文
2014/01/01 职场文书
表彰先进的通报
2014/01/31 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
入职担保书怎么写
2014/05/12 职场文书
我们的节日中秋节活动总结
2015/03/23 职场文书
个人催款函范文
2015/06/24 职场文书
《吃水不忘挖井人》教学反思
2016/02/22 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang
Pygame Event事件模块的详细示例
2021/11/17 Python