python 异步io_Python通过select实现异步IO的方法

本文实例讲述了Python通过select实现异步IO的方法。分享给大家供大家参考。具体如下:

在Python中使用select与poll比起在C中使用简单得多。select函数的参数是3个列表,包含整数文件描述符,或者带有可返回文件描述符的fileno()方法对象。第一个参数是需要等待输入的对象,第二个指定等待输出的对象,第三个参数指定异常情况的对象。第四个参数则为设置超时时间,是一个浮点数。指定以秒为单位的超时值。select函数将会返回一组文件描述符,包括输入,输出以及异常。

在linux下利用select实现多路IO的文件复制程序:

#!/usr/bin/env python

import select

#导入select模块

BLKSIZE=8192

def readwrite(fromfd,tofd):

readbuf = fromfd.read(BLKSIZE)

if readbuf:

tofd.write(readbuf)

tofd.flush()

return len(readbuf)

def copy2file(fromfd1,tofd1,fromfd2,tofd2):

''' using select to choice fds'''

totalbytes=0

if not (fromfd1 or fromfd2 or tofd1 or tofd2) :

#检查所有文件描述符是否合法

return 0

while True:

#开始利用select对输入所有输入的文件描述符进行监视

rs,ws,es = select.select([fromfd1,fromfd2],[],[])

for r in rs:

if r is fromfd1:

#当第一个文件描述符可读时,读入数据

bytesread = readwrite(fromfd1,tofd1)

totalbytes += bytesread

if r is fromfd2:

bytesread = readwrite(fromfd2,tofd2)

totalbytes += bytesread

if (bytesread <= 0):

break

return totalbytes

def main():

fromfd1 = open("/etc/fstab","r")

fromfd2 = open("/etc/passwd","r")

tofd1 = open("/root/fstab","w+")

tofd2 = open("/root/passwd","w+")

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

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

return 0

if __name__=="__main__":

main()

希望本文所述对大家的Python程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,可以使用 asyncio 库来实现异步 IO 操作。其中,select 函数是一种基于事件循环机制的 IO 多路复用技术,可以实现多个 IO 操作的并发处理。 下面是一个使用 select 实现异步 IO 的示例代码: ```python import asyncio import select async def async_read(fd): loop = asyncio.get_running_loop() fut = loop.create_future() loop.add_reader(fd, fut.set_result, fd) result = await fut loop.remove_reader(fd) return result async def main(): # 打开两个文件描述符 fd1 = open('file1.txt', 'r') fd2 = open('file2.txt', 'r') while True: # 使用 select 监听两个文件描述符 rlist, _, _ = select.select([fd1.fileno(), fd2.fileno()], [], []) # 读取就绪的文件描述符 for fd in rlist: data = await async_read(fd) print(data) if __name__ == '__main__': asyncio.run(main()) ``` 在上述代码中,我们使用 select.select 函数监听两个文件描述符,一旦有数据可读,就会进入循环体内的 async_read 函数读取数据,并通过 asyncio.Future 返回结果。使用 asyncio.get_running_loop() 获取当前事件循环,然后使用 loop.add_reader 将文件描述符添加到事件循环内的监听列表中,等待数据就绪。当 async_read 函数返回时,使用 loop.remove_reader 将文件描述符从监听列表中移除。最后,我们在 main 函数中使用 while 循环不断监听两个文件描述符,并异步读取数据。 需要注意的是,select.select 函数会阻塞当前线程,因此我们需要将其嵌入到异步任务中,以便在事件循环内部运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值