【问题标题】:Elapsed time of coroutines/futures using asyncio.gather()使用 asyncio.gather() 的协程/期货的经过时间
【发布时间】:2021-07-22 14:47:00
【问题描述】:
我有一个异步查询列表,我正在使用 asyncio.gather() 收集这些查询并使用 asyncio.run_until_complete() 等待。比如:
queries = [
async_query_a(),
async_query_b()
]
loop = asyncio.get_event_loop()
tasks = asyncio.gather(*queries)
results = loop.run_until_complete(tasks)
我想知道每个查询的“等待时间”。类似于 @log_performance 包装器的东西,它记录未来/协程完成的经过时间。
【问题讨论】:
标签:
python
asynchronous
query-optimization
python-asyncio
concurrent.futures
【解决方案1】:
这是timecoro 对协程函数计时的示例实现。
import asyncio
import functools
import logging
import random
import time
def timecoro(corofn):
@functools.wraps(corofn)
async def wrapper(*args, **kwargs):
start = time.time()
try:
result = await corofn(*args, **kwargs)
except Exception:
finish = time.time() - start
logging.info('%s failed in %.2f', corofn, finish)
raise
else:
finish = time.time() - start
logging.info('%s succeeded in %.2f', corofn, finish)
return result
return wrapper
@timecoro
async def async_query_a():
await asyncio.sleep(random.randint(0, 4))
@timecoro
async def async_query_b():
await asyncio.sleep(random.randint(0, 4))
raise RuntimeError
async def main():
queries = [
async_query_a(),
async_query_b(),
]
await asyncio.gather(*queries)
if __name__ == '__main__':
logging.basicConfig(level='INFO')
asyncio.run(main())