协程是asyncio的一等公民。他们使用Task对象在事件循环中进行各种操作。
我们想要执行Task任务运行的具体时间。
实现一个MonitorTask封装器,来记录Task的执行时间
import asyncio
import logging
logging.basicConfig(level=logging.DEBUG)
class MonitorTask(asyncio.Task):
def __init__(self, coro, *, loop):
super().__init__(coro, loop=loop)
self.start = loop.time()
self.loop = loop
def __del__(self):
super(MonitorTask, self).__del__()
self.loop = None # 避免循环引用
def __await__(self):
it = super(MonitorTask, self).__await__()
def awaited(instance):
try:
for i in it:
yield i # 同yield from语句,但是这可以在没有用asyncio.coroutine装饰的函数中使用
except BaseException as err:
raise err
finally: # Task完成之后,调用我们的计时逻辑