Я пытаюсь понять, как использовать новую функциональность AsyncIO в Python 3.4, и мне сложно понять, как использовать event_loop.add_reader(). Из ограниченных обсуждений, которые я обнаружил, похоже, что это чтение стандарта из отдельный процесс, а не содержимое открытого файла. Это правда? Если это так, то кажется, что нет специального способа AsyncIO для интеграции стандартного файлового ввода-вывода, верно ли это?
Я играл со следующим кодом. Вывод следующего дает исключение PermissionError: [Errno 1] Operation not permitted
из строки 399 /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 для чтения более одного файла за раз, как мне было интересно, вот пример того, как это можно сделать. Секрет в строке 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()
epoll
не поддерживает обычные файлы. - person dano   schedule 17.08.2014SelectorEventLoop
, который используетselectors
для выбора наиболее эффективного цикла обработки событий для платформы. Если это kqueue, то это должно быть то, что выбираетselectors
. Я не знаю, заставит ли этоadd_reader
работать с обычными файлами. Если вы попробуете, дайте мне знать, как это идет! - person dano   schedule 17.05.2016