とasyncio
とblessed
を使用して別のデータソースからデータを印刷できるコマンドライン用のレンダラーを作成しようとしました。これは改善されたバージョンですパイソン祝福のここでstdinやその他のソースから非同期でコンソールに書き込む
私がこれまで持っているものです。
import asyncio
from blessed import Terminal
@asyncio.coroutine
def render(term):
while True:
received = yield
if received:
print(term.bold + received + term.normal)
async def ping(renderer):
while True:
renderer.send('ping')
await asyncio.sleep(1)
async def input_reader(term, renderer):
while True:
with term.cbreak():
val = term.inkey()
if val.is_sequence:
renderer.send("got sequence: {0}.".format((str(val), val.name, val.code)))
elif val:
renderer.send("got {0}.".format(val))
async def client():
term = Terminal()
renderer = render(term)
render_task = asyncio.ensure_future(renderer)
pinger = asyncio.ensure_future(ping(renderer))
inputter = asyncio.ensure_future(input_reader(term, renderer))
done, pending = await asyncio.wait(
[pinger, inputter, renderer],
return_when=asyncio.FIRST_COMPLETED,
)
for task in pending:
task.cancel()
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(client())
asyncio.get_event_loop().run_forever()
学習とテストの目的のために、各第二および他のルーチン'ping'
を送るだけで、ダンプpingがあり、キー入力を取得し、また私に送信しなければならないことレンダラ。
ただし、このコードを使用してコマンドラインにpingが1回しか表示されず、input_readerが期待通りに機能します。私がping
に似たpong
でinput_readerを置き換えると、すべて問題ありません。祝福がasyncioで正しく動作するように構築されていないよう
$ python async_term.py
ping
got p.
got o.
got n.
got g.
(https://blessed.readthedocs.io/en/latest/overview.html#inkey)が遮断されていないと言います。しかし、行動は変わらない。クリーンなソリューションのアドバイスはありますか? stdinからの読み込みを担当することは祝福されてはいけません。私は主に出力制御に使用したいと考えています。 – dahrens