Python 3.x asyncio从协同程序获取结果
我的任务是在asyncio和python3的帮助下在协同程序之间进行通信。 请告诉我如何做,如果一个协程在whiletru循环中以不同的间隔返回值,而另一个协程接收到该数据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))
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()