У меня есть структура, аналогичная описанной в Equivalent of asyncio.Queues with worker "threads".Как получить сопроводительную копию на последовательном входе?
Разница - мой «производитель» откроет последовательную линию и асинхронно разобьет вход, пока не будет распознан «токен» (вместо генерации случайных чисел). Токены затем передаются через asyncio.Queue «потребителю».
Ориентировочный код включает в себя:
@asyncio.coroutine
def produce():
with open('infile.cmd', 'r') as ifd:
while True:
cmd = yield from ifd.readline()
if cmd is None:
break
print("received {}".format(cmd))
yield from q.put(cmd)
, но это не работает из-за «RuntimeError: Задача получила плохой выход:„р“» на ifd.readline()
линии.
Я также попытался с помощью Reader
(ср .: Using asyncio to read the output of a serial port):
event_loop = asyncio.get_event_loop()
try:
with open('infile.cmd', 'r') as ifd:
event_loop.add_reader(ifd, produce)
event_loop.create_task(consume())
print('entering event loop')
event_loop.run_forever()
но это бомбы с:
Traceback (most recent call last):
File "/home/mcon/trasmissione-telematica/Communications/prove/asio.py", line 32, in <module>
event_loop.add_reader(ifd, produce)
File "/usr/lib/python3.5/asyncio/selector_events.py", line 337, in add_reader
return self._add_reader(fd, callback, *args)
File "/usr/lib/python3.5/asyncio/selector_events.py", line 267, in _add_reader
(handle, None))
File "/usr/lib/python3.5/selectors.py", line 412, in register
self._epoll.register(key.fd, epoll_events)
PermissionError: [Errno 1] Operation not permitted
Как я могу асинхронно читать что-то?
Примечание: в этом примере я читаю из файла, но в конце мне придется считывать двоичные данные из неблокирующей последовательной строки (либо/dev/ttySx, либо именованного канала), поэтому o допускается линейный ввод; данные должны быть прочитаны, как только они доступны, и «производитель» несет ответственность за понимание, когда «cmd» завершен.