2017-01-28 4 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: 'P':タスクが悪い収量を得た" ifd.readline()ライン上を。

は私も使ってみましたReader(CFR:Using asyncio to read the output of a serial port):

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 

私は非同期的に、何かから読み取ることができます方法:と

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() 

が、この爆弾?

この例ではです。私はファイルから読んでいますが、結局、非ブロッキングシリアルライン(/ dev/ttySxまたは名前付きパイプ)からバイナリデータを読み込む必要があります。行指向の入力が許可されます。データは利用可能になるとすぐに読み取られなければならず、「プロデューサー」は「cmd」がいつ完了したかを理解する責任がある。 aiofilesとPythonを使って

答えて

0

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 
関連する問題