2017-01-28 10 views
0

У меня есть структура, аналогичная описанной в 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» завершен.

ответ

0

Использование aiofiles и питона 3.5+ следующий код работал большой:

async def produce(): 
    async with aiofiles.open('test.cmd', mode = 'r') as ifd: 
     while True: 
      cmd = await ifd.readline() 
      #readlines ourput is not stripped 
      cmd = cmd.strip() 
      if not cmd or cmd=='stop': 
       print("finished") 
       break 
      print("cmd {}".format(cmd)) 
      await q.put(cmd) 

loop = asyncio.get_event_loop() 
q = asyncio.Queue() 
loop.run_until_complete(produce()) 

test.cmd

mv hello 
cp world 
stop 

выход:

cmd mv hello 
cmd cp world 
finished 

 Смежные вопросы

  • Нет связанных вопросов^_^