让我们说我有一些asyncio协程,它会获取一些数据并返回它。像这样:
async def fetch_data(*args):
result = await some_io()
return result
基本上这个协同程序是从协同程序链调用的,初始协同程序是通过创建任务来运行的。 但是,如果出于测试目的,我想在运行某个文件时只运行一个协程:
if __name__ == '__main__':
result = await fetch_data(*args)
print(result)
显然我不能这样做,因为我试图运行并等待协程从非协程功能。
所以问题是:是否有一些正确的方法从协程获取数据而不调用它的功能?
我可以为Future
创建一些result
对象并等待它,但也许还有其他一些更简单明了的方法?
答案 0 :(得分:1)
您需要创建一个事件循环来运行您的协程:
import asyncio
async def async_func():
return "hello"
loop = asyncio.get_event_loop()
result = loop.run_until_complete(async_func())
loop.close()
print(result)
或作为一项功能:
def run_coroutine(f, *args, **kwargs):
loop = asyncio.get_event_loop()
result = loop.run_until_complete(f(*args, **kwargs))
loop.close()
return result
像这样使用:
print(run_coroutine(async_func))
或者:
assert "expected" == run_coroutine(fetch_data, "param1", param2="foo")