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实现的监测服务器硬盘使用率脚本分享
Nov 07 Python
使用python实现正则匹配检索远端FTP目录下的文件
Mar 25 Python
Python中的类与对象之描述符详解
Mar 27 Python
在Django中创建动态视图的教程
Jul 15 Python
Python实现Smtplib发送带有各种附件的邮件实例
Jun 05 Python
Python通过命令开启http.server服务器的方法
Nov 04 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
Python字符串中添加、插入特定字符的方法
Sep 10 Python
python读写文件write和flush的实现方式
Feb 21 Python
python读取多层嵌套文件夹中的文件实例
Feb 27 Python
python+selenium 脚本实现每天自动登记的思路详解
Mar 11 Python
PyCharm 安装与使用配置教程(windows,mac通用)
May 12 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
随时给自己贴的图片加文字的php代码
2007/03/08 PHP
PHP程序员必须清楚的问题汇总
2014/12/18 PHP
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
JavaScript 实现类的多种方法实例
2013/05/01 Javascript
html+js实现动态显示本地时间
2013/09/21 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
教你用AngularJS框架一行JS代码实现控件验证效果
2014/06/23 Javascript
Nodejs极简入门教程(三):进程
2014/10/27 NodeJs
JavaScript中eval函数的问题
2016/01/31 Javascript
JS实现div模块的截图并下载功能
2017/10/17 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
2020/12/30 Javascript
Vue中的methods、watch、computed的区别
2018/11/26 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
详解vue父子组件状态同步的最佳方式
2020/09/10 Javascript
[53:29]完美世界DOTA2联赛循环赛 DM vs Matador BO2第二场 11.04
2020/11/05 DOTA
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
Python模块搜索路径代码详解
2018/01/29 Python
python判断输入日期为第几天的实例
2018/11/13 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
2019/02/11 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
2020/04/16 Python
python 绘制正态曲线的示例
2020/09/24 Python
python 日志模块logging的使用场景及示例
2021/01/04 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
高分子材料个人求职信范文
2013/09/25 职场文书
大一军训感言
2014/01/09 职场文书
个人担保书格式范文
2014/05/12 职场文书
征用土地赔偿协议书
2014/09/26 职场文书
生产车间管理制度
2015/08/04 职场文书
教导处教学工作总结
2015/08/12 职场文书
超级详细实用的pycharm常用快捷键
2021/05/12 Python
Python 解决空列表.append() 输出为None的问题
2021/05/23 Python
Java实现学生管理系统(IO版)
2022/02/24 Java/Android
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android
jdbc中自带MySQL 连接池实践示例
2022/07/23 MySQL