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缩进和冒号详解
Jun 01 Python
python如何使用正则表达式的前向、后向搜索及前向搜索否定模式详解
Nov 08 Python
python 中的list和array的不同之处及转换问题
Mar 13 Python
pandas pivot_table() 按日期分多列数据的方法
Nov 16 Python
Python爬虫——爬取豆瓣电影Top250代码实例
Apr 17 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
使用python快速在局域网内搭建http传输文件服务的方法
Nov 14 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 Python
Django的ListView超详细用法(含分页paginate)
May 21 Python
Django跨域请求原理及实现代码
Nov 14 Python
pycharm 实现复制一行的快捷键
Jan 15 Python
pygame面向对象的飞行小鸟实现(Flappy bird)
Apr 01 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 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
php 传值赋值与引用赋值的区别
2010/12/29 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
2016/11/14 PHP
php 后端实现JWT认证方法示例
2018/09/04 PHP
php使用自带dom扩展进行元素匹配的原理解析
2020/05/29 PHP
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
Javascript查询DBpedia小应用实例学习
2013/03/07 Javascript
js实现的二级横向菜单条实例
2015/08/22 Javascript
基于javascript制作微博发布栏效果
2016/04/04 Javascript
JavaScript 消息框效果【实现代码】
2016/04/27 Javascript
Angular表单验证实例详解
2016/10/20 Javascript
Windows下快速搭建NodeJS本地服务器的步骤
2017/08/09 NodeJs
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
[01:04:05]VG vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
详解在Python中处理异常的教程
2015/05/24 Python
将pandas.dataframe的数据写入到文件中的方法
2018/12/07 Python
Python文件常见操作实例分析【读写、遍历】
2018/12/10 Python
pyqt远程批量执行Linux命令程序的方法
2019/02/14 Python
简单了解Python生成器是什么
2019/07/02 Python
HTML5 DeviceOrientation实现手机网站摇一摇功能代码实例
2015/04/24 HTML / CSS
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
Rag & Bone官网:瑞格布恩高级成衣
2018/04/19 全球购物
西班牙著名的珠宝首饰品牌:P D PAOLA
2018/09/15 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
秘书行业自我鉴定范文
2013/12/30 职场文书
2014自荐信的写作技巧
2014/01/28 职场文书
九年级数学教学反思
2014/02/02 职场文书
行政文秘岗位职责范本
2014/02/10 职场文书
银行进社区活动总结
2014/07/07 职场文书
项目投资合作意向书
2014/07/29 职场文书
民主生活会整改措施(党员)
2014/09/18 职场文书
三严三实·严以律己心得体会
2016/01/13 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
AJAX引擎原理以及XmlHttpRequest对象的axios、fetch区别详解
2022/04/09 Javascript