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学习之第三方包安装方法(两种方法)
Jul 30 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
python 爬虫出现403禁止访问错误详解
Mar 11 Python
Python实现修改IE注册表功能示例
May 10 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
使用python实现数组、链表、队列、栈的方法
Dec 20 Python
基于python实现语音录入识别代码实例
Jan 17 Python
tensorboard显示空白的解决
Feb 15 Python
python实现信号时域统计特征提取代码
Feb 26 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
教你怎么用Python监控愉客行车程
Apr 29 Python
Python Pytorch查询图像的特征从集合或数据库中查找图像
Apr 09 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通过COM使用ADODB的简单例子
2006/12/31 PHP
在PHP里得到前天和昨天的日期的代码
2007/08/16 PHP
php编程每天必学之表单验证
2016/03/01 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
JS文本框默认值处理详解
2013/07/10 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
浅谈javascript中字符串String与数组Array
2014/12/31 Javascript
在JavaScript中使用NaN值的方法
2015/06/05 Javascript
基于jquery实现智能表单验证操作
2016/05/09 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
浅谈js键盘事件全面控制
2016/12/01 Javascript
超简单的Vue.js环境搭建教程
2017/03/17 Javascript
Angular中使用better-scroll插件的方法
2018/03/27 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
Vue Extends 扩展选项用法完整实例
2019/09/17 Javascript
element-ui中dialog弹窗关闭按钮失效的解决
2020/09/22 Javascript
在vue中使用jsonp进行跨域请求接口操作
2020/10/29 Javascript
Python中optionParser模块的使用方法实例教程
2014/08/29 Python
浅析Python中将单词首字母大写的capitalize()方法
2015/05/18 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
使用css3绘制出各种几何图形
2016/08/17 HTML / CSS
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
澳大利亚最受欢迎的女士度假服装:Kabana Shop
2020/10/10 全球购物
英文商务邀请信
2014/01/22 职场文书
上课睡觉检讨书
2014/01/28 职场文书
幼儿园教师教育感言
2014/02/28 职场文书
老干部座谈会主持词
2015/07/03 职场文书
初中地理教学反思
2016/02/19 职场文书
Python爬取某拍短视频
2021/06/11 Python