2016-12-16 20 views
1

私はコルーチンとヘルプasyncioとpython3で通信を行うタスクを持っています。 1つのコルーチン場合 はTRUサイクル、異なる間隔で戻り値、及び他のコルーチンは、このデータasyncio 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

使用「asyncio.Queue」 –

+0

ありがとうございました。キューを使用するつもりなら、待ち行列を常にチェックするのではなく、イベントでそれをどのように読むことができるのでしょうか。キュー " –

+0

"を使用するメソッド "asyncio.Future()。add_done_callback(func)"の原則で動作する必要があります。エンドユーザのコードは決して '.add_done_callback'を呼び出すべきではありません。 '真:wait.get()'を実行します。 –

答えて

0

を受けながら、溶液がasyncio.Queueの助けを借りていた中で、それを行う方法を教えてください

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() 
関連する問題