私は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を使って