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实现在windows下操作word的方法
Apr 28 Python
python利用Guetzli批量压缩图片
Mar 23 Python
简单易懂的python环境安装教程
Jul 13 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
Tensorflow卷积神经网络实例进阶
May 24 Python
django传值给模板, 再用JS接收并进行操作的实例
May 28 Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 Python
python线程的几种创建方式详解
Aug 29 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
Nov 11 Python
关于python中remove的一些坑小结
Jan 04 Python
Python的collections模块真的很好用
Mar 01 Python
Pytest之测试命名规则的使用
Apr 16 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/02 日漫
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
用php实现让页面只能被百度gogole蜘蛛访问的方法
2009/12/29 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
CI框架验证码CAPTCHA辅助函数用法实例
2014/11/05 PHP
php中关于socket的系列函数总结
2015/05/18 PHP
PHP使用trim函数去除字符串左右空格及特殊字符实例
2016/01/07 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
2019/10/21 PHP
js 操作select相关方法函数
2009/12/06 Javascript
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
JS执行删除前的判断代码
2014/02/18 Javascript
AngularJS入门教程之Hello World!
2014/12/06 Javascript
JavaScript 控制字体大小设置的方法
2016/11/23 Javascript
JavaScript微信定位功能实现方法
2016/11/29 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
分析javascript原型及原型链
2018/03/18 Javascript
微信小程序入门之广告条实现方法示例
2018/12/05 Javascript
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
2020/05/12 Javascript
vue 动态添加的路由页面刷新时失效的原因及解决方案
2021/02/26 Vue.js
对python for 文件指定行读写操作详解
2018/12/29 Python
在python里从协程返回一个值的示例
2019/02/19 Python
详解python中@的用法
2019/03/27 Python
python实现ip地址查询经纬度定位详解
2019/08/30 Python
Python OpenCV读取显示视频的方法示例
2020/02/20 Python
PyQt5结合matplotlib绘图的实现示例
2020/09/15 Python
高清屏中使用Canvas绘图出现模糊的问题及解决方法
2019/06/03 HTML / CSS
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
美国领先的机场停车聚合商:Airport Parking Reservations
2020/02/28 全球购物
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
高中生家长寄语大全
2014/04/03 职场文书
科技之星事迹材料
2014/06/02 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
考试后的感想
2015/08/07 职场文书
创业计划书之面包店
2019/09/17 职场文书