我正在尝试理解如何在Python 3.4中使用新的AsyncIO功能,我正在努力使用
event_loop.add_reader().从
limited discussions我发现它看起来像是用于读取标准的单独进程反对打开文件的内容.真的吗?如果是这样,似乎没有AsyncIO特定的方式来集成标准文件IO,这也是真的吗?
我一直在玩以下代码.以下输出给出异常PermissionError:[Errno 1]不允许从addpyader()行触发的/python3.4/selectors.py self._epoll.register(key.fd,epoll_events)的第399行操作下面
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一次读取多个文件的例子,我很好奇,这里有一个如何实现它的例子.秘密在于来自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()