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中的yield使用方法
Feb 11 Python
使用Python操作MySQL的一些基本方法
Aug 16 Python
在Python的Flask框架中构建Web表单的教程
Jun 04 Python
Python网络爬虫中的同步与异步示例详解
Feb 03 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
May 18 Python
PyQt打开保存对话框的方法和使用详解
Feb 27 Python
快速解决vue.js 模板和jinja 模板冲突的问题
Jul 26 Python
Django中使用haystack+whoosh实现搜索功能
Oct 08 Python
Pytorch evaluation每次运行结果不同的解决
Jan 02 Python
使用Django和Postgres进行全文搜索的实例代码
Feb 13 Python
python实现遍历文件夹图片并重命名
Mar 23 Python
详解Python类和对象内容
Jun 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
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
php 一元分词算法
2009/11/30 PHP
PHP学习之正则表达式
2011/04/17 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
JavaScript触发器详解
2007/03/10 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
JQuery显示隐藏页面元素的方法总结
2015/04/16 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
Angular2开发——组件规划篇
2017/03/28 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
js微信分享接口调用详解
2019/07/23 Javascript
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
2020/02/09 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
python利用elaphe制作二维条形码实现代码
2012/05/25 Python
python的即时标记项目练习笔记
2014/09/18 Python
python爬取个性签名的方法
2018/06/17 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
2020/01/21 Python
英国打印机墨水和碳粉商店:Printerinks
2017/06/30 全球购物
CHARLES & KEITH台湾官网:新加坡时尚品牌
2019/07/30 全球购物
人力资源管理专业毕业生推荐信
2013/11/07 职场文书
毕业生求职自荐信怎么写
2014/01/08 职场文书
2014年大学生四年规划书范文
2014/04/03 职场文书
道德大讲堂实施方案
2014/05/14 职场文书
会计求职信
2014/05/29 职场文书
工商管理本科生求职信
2014/07/13 职场文书
大学毕业生管理学求职信
2014/09/01 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
小学二年级语文教学反思
2016/03/03 职场文书
2016年党员公开承诺书范文
2016/03/24 职场文书
为什么 Nginx 比 Apache 更牛逼
2021/03/31 Servers
一篇文章弄懂MySQL查询语句的执行过程
2021/05/07 MySQL