Python 3.x asyncio从协同程序获取结果

Python 3.x asyncio从协同程序获取结果,python-3.x,python-asyncio,Python 3.x,Python Asyncio,我的任务是在asyncio和python3的帮助下在协同程序之间进行通信。 请告诉我如何做,如果一个协程在whiletru循环中以不同的间隔返回值,而另一个协程接收到该数据 import asyncio @asyncio.coroutine def write(future): i=0 while True: yield from asyncio.sleep(1) future.set_result('data: '.format(i))

我的任务是在asyncio和python3的帮助下在协同程序之间进行通信。 请告诉我如何做,如果一个协程在whiletru循环中以不同的间隔返回值,而另一个协程接收到该数据

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()

在asyncio.Queue()的帮助下找到了解决方案


在asyncio.Queue()的帮助下找到了解决方案


使用
asyncio.Queue
非常感谢您的帮助。但如果我要使用队列,我如何在事件中读取它,而不是不断检查队列。它必须按照“asyncio.Future().add_done_callback(func)”方法的原则工作。使用队列的最终用户代码永远不应该调用
。add_done_callback
——级别太低。正确时只需执行
:等待queue.get()
。我明白了,如果您能用解释的解决方案回答您的问题,谢谢您--这可能对其他人有用:)使用
asyncio.queue
非常感谢您的帮助。但如果我要使用队列,我如何在事件中读取它,而不是不断检查队列。它必须按照“asyncio.Future().add_done_callback(func)”方法的原则工作。使用队列的最终用户代码永远不应该调用
。add_done_callback
——级别太低。只需执行
,而不必执行True:wait queue.get()
。我明白了,如果您能用解释性的解决方案回答您的问题,谢谢您--这可能对其他人有用:)
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()