2017-04-01 11 views
0

asyncioblessedを使用して別のデータソースからデータを印刷できるコマンドライン用のレンダラーを作成しようとしました。これは改善されたバージョンですパイソン祝福のここで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. 

答えて

0

に思える::

これは「ピンポン」と入力する場合、それは「ピンポン」の書き込みに10秒かかる場合が、それは、どのように見えるかですinkey()ですブロッキング方法。これは他のクルーチンをブロックします。

kbhit()await asyncio.sleep()のループを使用すると、他のコルーチンに制御を渡すことができますが、これはきれいなasyncioソリューションではありません。 'タイムアウト= 0' [ドキュメント]とinkey` `について

+0

(https://blessed.readthedocs.io/en/latest/overview.html#inkey)が遮断されていないと言います。しかし、行動は変わらない。クリーンなソリューションのアドバイスはありますか? stdinからの読み込みを担当することは祝福されてはいけません。私は主に出力制御に使用したいと考えています。 – dahrens

関連する問題