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 相关文章推荐
Flask入门教程实例:搭建一个静态博客
Mar 27 Python
一步步解析Python斗牛游戏的概率
Feb 12 Python
Python实现SMTP发送邮件详细教程
Mar 02 Python
python中常用的九种预处理方法分享
Sep 11 Python
详解Django的CSRF认证实现
Oct 09 Python
Pandas之Dropna滤除缺失数据的实现方法
Jun 25 Python
基于tensorflow指定GPU运行及GPU资源分配的几种方式小结
Feb 03 Python
Python获取对象属性的几种方式小结
Mar 12 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
Sep 11 Python
解决TensorFlow训练模型及保存数量限制的问题
Mar 03 Python
用Python写一个简易版弹球游戏
Apr 13 Python
Python爬虫基础讲解之请求
May 13 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 图像处理类1
2009/06/15 PHP
PHP操作XML作为数据库的类
2010/12/19 PHP
php.ini 配置文件的深入解析
2013/06/17 PHP
Laravel框架用户登陆身份验证实现方法详解
2017/09/14 PHP
PHP实现通过文本文件统计页面访问量功能示例
2019/02/13 PHP
js类 from qq
2006/11/13 Javascript
在JavaScript中实现命名空间
2006/11/23 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
JavaScript的类型、值和变量小结
2015/07/09 Javascript
JavaScript中双向数据绑定详解
2017/05/03 Javascript
vue+mockjs模拟数据实现前后端分离开发的实例代码
2017/08/08 Javascript
vue 实现数字滚动增加效果的实例代码
2018/07/06 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
Javascript 关于基本类型和引用类型的个人理解
2019/11/01 Javascript
vue.js+ElementUI实现进度条提示密码强度效果
2020/01/18 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
[01:01:13]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第三场
2018/04/06 DOTA
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
python删除过期log文件操作实例解析
2018/01/31 Python
对pandas中apply函数的用法详解
2018/04/10 Python
Python日期时间Time模块实例详解
2019/04/15 Python
python中的协程深入理解
2019/06/10 Python
Python configparser模块操作代码实例
2020/06/08 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
css3 iphone玻璃透明气泡完美实现
2013/03/20 HTML / CSS
HTML利用九宫格原理进行网页布局
2020/03/13 HTML / CSS
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
System.Array.CopyTo()和System.Array.Clone()有什么区别
2016/06/20 面试题
推广活动策划方案
2014/08/23 职场文书
教师节校长致辞
2015/07/31 职场文书
Python开发五子棋小游戏
2022/04/28 Python