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创建对一个  多路文件复制程序,代码如下:
# -*- coding: utf-8 -*- 
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 |		# 1
		 select.POLLPRI |		# 2
		select.POLLHUP |		# 16
		select.POLLERR )		# 8
	totalbytes=0

	if not (fromfd1 or fromfd2 or tofd1 or tofd2) :
		return 0
	fd_dict = {fromfd1.fileno():fromfd1,fromfd2.fileno():fromfd2}
	
	#Returns a polling object, which supports registering and
    	#unregistering file descriptors, and then polling them for I/O events.
	p=select.poll()
	#print READ_ONLY

	#利用poll对象p对需要监视的文件描述符进行注册
	p.register(fromfd1.fileno(),READ_ONLY)
	p.register(fromfd2.fileno(),READ_ONLY)

	while True:
	    #Polls the set of registered file descriptors, returning a list containing 
    	    #any descriptors that have events or errors to report.
	    result = p.poll()
	    if len(result) != 0:
		for fd,events in result:
		    #print "events is "
		    #print events
		    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("/home/sina/conte.txt","r")
	fromfd2 = open("/home/sina/lspci.txt","r")

	tofd1 = open("to1.txt","w+")
	tofd2 = open("to2.txt","w+")

	totalbytes = copyPoll(fromfd1,tofd1,fromfd2,tofd2)

	print "Number of bytes copied %d\n" % totalbytes
	return 0

if __name__=="__main__":
	main()




原文链接:

http://blog.chinaunix.net/uid-20135217-id-3291050.html





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值