我想實現從標準輸入傳遞數據給協程的一個簡單的想法:的Python ASYNCIO:讀者回調和協程通信
import asyncio
import sys
event = asyncio.Event()
def handle_stdin():
data = sys.stdin.readline()
event.data = data # NOTE: data assigned to the event object
event.set()
@asyncio.coroutine
def tick():
while 1:
print('Tick')
yield from asyncio.sleep(1)
if event.is_set():
data = event.data # NOTE: data read from the event object
print('Data received: {}'.format(data))
event.clear()
def main():
loop = asyncio.get_event_loop()
loop.add_reader(sys.stdin, handle_stdin)
loop.run_until_complete(tick())
if __name__ == '__main__':
main()
此代碼工作正常,但是它的一個簡化版本,帶有可變而不是Event
對象的作品太:
data = None
def handle_stdin():
global data
data = sys.stdin.readline()
@asyncio.coroutine
def tick():
while 1:
print('Tick')
yield from asyncio.sleep(1)
global data
if data is not None:
print('Data received: {}'.format(data))
data = None
我的問題是:是Event
的方法正確嗎?還是有更好的方法與另一個asyncio對象來處理這種問題? 然後,如果與Event
的方法是好的,使用變量是否也很好?
謝謝。
非常感謝@dano,'queue'的方法看起來比事件''好得多。 –