Sto cercando di implementare un semplice idea di passare un dato da stdin ad un coroutine:Python asyncio: lettore di callback e comunicazione coroutine
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()
Questo codice funziona benissimo tuttavia una versione, semplificata di esso con una variabile invece di un oggetto Event
lavora troppo:
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
le mie domande sono: è l'approccio con Event
corretto? O c'è un modo migliore con un altro oggetto asyncio per gestire questo tipo di problema? Quindi, se l'approccio con Event
va bene, l'uso di una variabile va bene?
Grazie.
Grazie mille @dano, l'approccio 'queue' sembra davvero migliore dell''evento" 'uno". –