gpt4 book ai didi

python - Python AsyncIO 的 loop.add_reader() 期望什么文件描述符对象?

转载 作者:太空狗 更新时间:2023-10-29 22:26:13 31 4
gpt4 key购买 nike

我正试图了解如何在 Python 3.4 中使用新的 AsyncIO 功能,并且我正在努力了解如何使用 event_loop.add_reader() .来自limited discussions我发现它看起来像是从一个单独的进程中读取标准而不是打开文件的内容。真的吗?如果是这样,似乎没有 AsyncIO 特定的方法来集成标准文件 IO,这也是真的吗?

我一直在玩下面的代码。以下输出给出异常 PermissionError: [Errno 1] Operation not permitted from line 399 of/python3.4/selectors.py self._epoll.register(key.fd, epoll_events ) 由下面的 add_reader() 行触发

import asyncio
import urllib.parse
import sys
import pdb
import os

def fileCallback(*args):
pdb.set_trace()

path = sys.argv[1]
loop = asyncio.get_event_loop()
#fd = os.open(path, os.O_RDONLY)
fd = open(path, 'r')
#data = fd.read()
#print(data)
#fd.close()
pdb.set_trace()
task = loop.add_reader(fd, fileCallback, fd)
loop.run_until_complete(task)
loop.close()

编辑

对于那些正在寻找如何使用 AsyncIO 一次读取多个文件的例子的人,就像我很好奇一样,这里有一个如何完成它的例子。 secret 就在 yield from asyncio.sleep(0) 行中。这实质上暂停了当前函数,将其放回事件循环队列中,以便在执行所有其他就绪函数后调用。函数根据它们的调度方式确定是否准备就绪。

import asyncio

@asyncio.coroutine
def read_section(file, length):
yield from asyncio.sleep(0)
return file.read(length)

@asyncio.coroutine
def read_file(path):
fd = open(path, 'r')
retVal = []
cnt = 0
while True:
cnt = cnt + 1
data = yield from read_section(fd, 102400)
print(path + ': ' + str(cnt) + ' - ' + str(len(data)))
if len(data) == 0:
break;
fd.close()

paths = ["loadme.txt", "loadme also.txt"]
loop = asyncio.get_event_loop()
tasks = []
for path in paths:
tasks.append(asyncio.async(read_file(path)))
loop.run_until_complete(asyncio.wait(tasks))
loop.close()

最佳答案

这些函数需要一个文件描述符,即操作系统使用的底层整数,而不是 Python 的文件对象。基于文件描述符的文件对象在 fileno() 方法上返回该描述符,例如:

>>> sys.stderr.fileno()
2

在 Unix 中,文件描述符可以附加到文件或许多其他事物,包括其他进程。

针对 OP 的编辑进行编辑:

正如 Max 在评论中所说,您不能在本地文件上使用 epoll(而 asyncio 使用 epoll)。是的,这有点奇怪。不过,您可以在管道上使用它,例如:

import asyncio
import urllib.parse
import sys
import pdb
import os

def fileCallback(*args):
print("Received: " + sys.stdin.readline())

loop = asyncio.get_event_loop()
task = loop.add_reader(sys.stdin.fileno(), fileCallback)
loop.run_forever()

这将回显你在标准输入上写的东西。

关于python - Python AsyncIO 的 loop.add_reader() 期望什么文件描述符对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25351999/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com