测试从常规函数调用python协程(async def)

时间:2016-12-21 13:31:42

标签: python-3.x python-3.5 python-asyncio

让我们说我有一些asyncio协程,它会获取一些数据并返回它。像这样:

async def fetch_data(*args):
  result = await some_io()
  return result

基本上这个协同程序是从协同程序链调用的,初始协同程序是通过创建任务来运行的。 但是,如果出于测试目的,我想在运行某个文件时只运行一个协程:

if __name__ == '__main__':
  result = await fetch_data(*args)
  print(result)

显然我不能这样做,因为我试图运行并等待协程从非协程功能。 所以问题是:是否有一些正确的方法从协程获取数据而不调用它的功能? 我可以为Future创建一些result对象并等待它,但也许还有其他一些更简单明了的方法?

1 个答案:

答案 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")