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 28 Python
Python函数中的函数(闭包)用法实例
Mar 15 Python
Python的Django框架中消息通知的计数器实现教程
Jun 13 Python
解决python3 urllib中urlopen报错的问题
Mar 25 Python
Python设计模式之中介模式简单示例
Jan 09 Python
解决python中使用plot画图,图不显示的问题
Jul 04 Python
解决Python3中的中文字符编码的问题
Jul 18 Python
详解将Django部署到Centos7全攻略
Sep 26 Python
Python中super函数用法实例分析
Mar 18 Python
Python实现的微信支付方式总结【三种方式】
Apr 13 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
Jun 05 Python
Python笔记之facade模式
Nov 20 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/03 欧美动漫
url decode problem 解决方法
2011/12/26 PHP
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
php程序员应具有的7种能力小结
2014/11/27 PHP
PHP基于curl实现模拟微信浏览器打开微信链接的方法示例
2019/02/15 PHP
php实现文件上传基本验证
2020/03/04 PHP
关于JQuery($.load)事件的用法和分析
2013/04/09 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
微信小程序 二维码canvas绘制实例详解
2017/01/06 Javascript
js放大镜放大购物图片效果
2017/01/18 Javascript
详解Vue SPA项目优化小记
2018/07/03 Javascript
详解vue axios二次封装
2018/07/22 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
[49:58]完美世界DOTA2联赛PWL S3 Magma vs DLG 第一场 12.18
2020/12/19 DOTA
python Selenium爬取内容并存储至MySQL数据库的实现代码
2017/03/16 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
python实现在列表中查找某个元素的下标示例
2020/11/16 Python
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
ProBikeKit新西兰:自行车套件,跑步和铁人三项装备
2017/04/05 全球购物
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
期末自我鉴定
2014/01/23 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
学生抄袭作业的检讨书
2014/10/02 职场文书
政协会议宣传标语
2014/10/09 职场文书
教师群众路线心得体会
2014/11/04 职场文书
2014年司机工作总结
2014/11/21 职场文书
2015关爱留守儿童工作总结
2014/12/12 职场文书
工程技术员岗位职责
2015/04/11 职场文书
小学数学教学随笔
2015/08/14 职场文书
田径运动会广播稿
2015/08/19 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
Java 超详细讲解IO操作字节流与字符流
2022/03/25 Java/Android