有没有办法让asyncio.create_task返回异步函数之外的值?

时间:2019-11-03 18:53:38

标签: python python-asyncio

我需要从异步函数外部的asyncio.create_task(function())返回一个值。


import asyncio

async def hello():
    return("hello")

response = asyncio.get_event_loop().create_task(hello())
print(response)

这是输出:

<Task pending coro=<hello() running at C:\Users\\PycharmProjects\PCWebsite\fjdfjd.py:3>>

当我想接收时:

"Hello"

请注意,我不能使用.run()

RuntimeError: asyncio.run() cannot be called from a running event loop

或者在我收到错误消息时run_until_complete

RuntimeError: This event loop is already running

2 个答案:

答案 0 :(得分:0)

根据asyncio.create_task文档,该函数返回一个Task对象。

  

asyncio.create_task(coro,*,name = None)

     

将coro协程包装到Task中并安排其执行时间。返回   任务对象。

您可以使用Task函数在结果准备就绪(任务完成)时调用函数task.result(),从任务本身中提取结果(以及其他信息)。

示例:

import asyncio

async def func1():
    return 1233

loop = asyncio.get_event_loop()
task = loop.create_task(func1())
# The following line is needed so the loop will run and complete the task in the first place.
loop.run_until_complete(task)

结果:

>>> task.done()
True
>>> task.result()
1233

答案 1 :(得分:0)

如果您是从jupyter笔记本运行此代码,则可以在新单元格中执行以下操作:

await hello()

由于事件循环已在运行,因此您无需担心会发生事件循环。 如果要在终端上运行它,则应该执行以下操作:

asyncio.run(hello())