2016-12-16 8 views
1

Ich habe eine Aufgabe machen die Kommunikation zwischen Coroutinen mit Hilfe asyncio und python3. Bitte sagen Sie mir, wie es geht, wenn man Koroutine, in während tru Zyklus, Rückgabewert in unterschiedlichen Intervallen, und die anderen Koroutinen empfängt diese Datenasyncio get Ergebnis von coroutine

import asyncio 

@asyncio.coroutine 
def write(future): 
    i=0 
    while True: 
     yield from asyncio.sleep(1) 
     future.set_result('data: '.format(i)) 
     i+=1 

def got_result(future): 
    print(future.result()) 


loop = asyncio.get_event_loop() 
future = asyncio.Future() 
asyncio.ensure_future(write(future)) 

future.add_done_callback(got_result) 

try: 
    loop.run_forever() 
finally: 
    loop.close() 
+0

Verwenden Sie 'asyncio.Queue' –

+0

Vielen Dank für Ihre Hilfe. aber wenn ich Queue verwenden werde, wie kann ich es auf dem Ereignis lesen, nicht ständig die Warteschlange überprüfen. Es muss nach dem Prinzip der Methode "asyncio.Future(). add_done_callback (func)" mit der Warteschlange –

+0

funktionieren Endbenutzer-Code sollte nie '.add_done_callback' aufrufen - es ist zu niedrig. Tun Sie einfach 'while True: Warten Sie auf queue.get()'. –

Antwort

0

Die Lösung mit Hilfe des asyncio.Queue gefunden wurde()

import asyncio 

@asyncio.coroutine 
def get_work(task, work_queue): 
    while not work_queue.empty(): 
     print(task) 
     queue_item = yield from work_queue.get() 
     print('{0} grabbed item: {1}'.format(task, queue_item)) 
     yield from asyncio.sleep(0.5) 
    asyncio.async(get_work(task, work_queue)) 

# @asyncio.coroutine 

i = 0 
async def do_work(task, work_queue): 
    global i 
    print(task) 
    while work_queue.empty(): 
     work_queue.put_nowait(i) 
     i += 1 
     await asyncio.sleep(2) 
     break 
    # asyncio.async(do_work()) 
    print("Dfgdfg") 
    asyncio.ensure_future(do_work(task, work_queue)) 




if __name__ == "__main__": 
    queue_obj = asyncio.Queue() 
    loop = asyncio.get_event_loop() 

    tasks = [ 
     asyncio.async(do_work('Run do_work', queue_obj)), 
     asyncio.async(get_work('Run get_work', queue_obj))] 

    loop.run_until_complete(asyncio.wait(tasks)) 
    loop.run_forever() 
Verwandte Themen