我正在使用python3编写一个应用程序,并且第一次尝试异步。我遇到的一个问题是,我的一些协同机制阻塞事件循环的时间比我喜欢的要长。我正试图为事件循环找一些类似顶部的东西,它将显示运行我的每个协同器所花费的墙壁/cpu时间。如果没有任何已经存在的东西,是否有人知道向事件循环中添加钩子的方法,以便我可以进行测量?
我尝试过使用cProfile,它提供了一些有用的输出,但我更感兴趣的是阻塞事件循环所花费的时间,而不是总执行时间。
发布于 2016-08-09 17:55:31
事件循环已经可以跟踪协同工作是否需要大量的CPU时间来执行。要查看它,您应该使用启用调试模式和set_debug方法:
import asyncio
import time
async def main():
time.sleep(1) # Block event loop
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.set_debug(True) # Enable debug
loop.run_until_complete(main())在输出中,您将看到:
Executing <Task finished coro=<main() [...]> took 1.016 seconds默认情况下,它显示对阻塞超过0.1秒的协同线的警告。它没有文档化,但是基于异步源代码,看起来您可以更改slow_callback_duration属性来修改这个值。
发布于 2016-08-10 12:20:57
您可以使用call_later。定期运行回调,以记录/通知循环的时间间隔和周期间隔时间的差异。
class EventLoopDelayMonitor:
def __init__(self, loop=None, start=True, interval=1, logger=None):
self._interval = interval
self._log = logger or logging.getLogger(__name__)
self._loop = loop or asyncio.get_event_loop()
if start:
self.start()
def run(self):
self._loop.call_later(self._interval, self._handler, self._loop.time())
def _handler(self, start_time):
latency = (self._loop.time() - start_time) - self._interval
self._log.error('EventLoop delay %.4f', latency)
if not self.is_stopped():
self.run()
def is_stopped(self):
return self._stopped
def start(self):
self._stopped = False
self.run()
def stop(self):
self._stopped = True示例
import time
async def main():
EventLoopDelayMonitor(interval=1)
await asyncio.sleep(1)
time.sleep(2)
await asyncio.sleep(1)
await asyncio.sleep(1)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())输出
EventLoop delay 0.0013
EventLoop delay 1.0026
EventLoop delay 0.0014
EventLoop delay 0.0015https://stackoverflow.com/questions/38856410
复制相似问题