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脚本处理空格的方法
Aug 08 Python
pygame实现弹力球及其变速效果
Jul 03 Python
python 实现上传图片并预览的3种方法(推荐)
Jul 14 Python
利用Tkinter(python3.6)实现一个简单计算器
Dec 21 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
wxPython实现带颜色的进度条
Nov 19 Python
python中tab键是什么意思
Jun 18 Python
Python制作数据预测集成工具(值得收藏)
Aug 21 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
Python实现简单猜数字游戏
Feb 03 Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 Python
python可视化之颜色映射详解
Sep 15 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
德生PL330测评
2021/03/02 无线电
用 php 编写的日历
2006/10/09 PHP
PHP开发文件系统实例讲解
2006/10/09 PHP
一个程序下载的管理程序(三)
2006/10/09 PHP
几款免费开源的不用数据库的php的cms
2010/12/19 PHP
基于PHP 面向对象之成员方法详解
2013/05/04 PHP
PHP解析RSS的方法
2015/03/05 PHP
php对文件进行hash运算的方法
2015/04/03 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
YII框架http缓存操作示例
2019/04/29 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
javascript 禁止复制网页
2009/06/11 Javascript
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
javascript设计模式之中介者模式Mediator
2014/12/30 Javascript
jQuery使用attr()方法同时设置多个属性值用法实例
2015/03/26 Javascript
贴近用户体验的Jquery日期、时间选择插件
2015/08/19 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
在 Vue 项目中引入 tinymce 富文本编辑器的完整代码
2018/05/04 Javascript
angular 组件通信的几种实现方式
2018/07/13 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
Python fileinput模块使用实例
2015/06/03 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
2017/03/11 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
化学专业毕业生自荐信
2013/11/15 职场文书
网络编辑岗位职责范本
2014/02/10 职场文书
2014全国两会学习心得体会2000字
2014/03/10 职场文书
《真想变成大大的荷叶》教学反思
2014/04/14 职场文书
解决Pytorch修改预训练模型时遇到key不匹配的情况
2021/06/05 Python
利用Redis实现点赞功能的示例代码
2022/06/28 Redis