首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >监视异步事件循环

监视异步事件循环
EN

Stack Overflow用户
提问于 2016-08-09 16:49:22
回答 4查看 8K关注 0票数 17

我正在使用python3编写一个应用程序,并且第一次尝试异步。我遇到的一个问题是,我的一些协同机制阻塞事件循环的时间比我喜欢的要长。我正试图为事件循环找一些类似顶部的东西,它将显示运行我的每个协同器所花费的墙壁/cpu时间。如果没有任何已经存在的东西,是否有人知道向事件循环中添加钩子的方法,以便我可以进行测量?

我尝试过使用cProfile,它提供了一些有用的输出,但我更感兴趣的是阻塞事件循环所花费的时间,而不是总执行时间。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-08-09 17:55:31

事件循环已经可以跟踪协同工作是否需要大量的CPU时间来执行。要查看它,您应该使用启用调试模式set_debug方法:

代码语言:javascript
复制
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())

在输出中,您将看到:

代码语言:javascript
复制
Executing <Task finished coro=<main() [...]> took 1.016 seconds

默认情况下,它显示对阻塞超过0.1秒的协同线的警告。它没有文档化,但是基于异步源代码,看起来您可以更改slow_callback_duration属性来修改这个值。

票数 22
EN

Stack Overflow用户

发布于 2016-08-10 12:20:57

您可以使用call_later。定期运行回调,以记录/通知循环的时间间隔和周期间隔时间的差异。

代码语言:javascript
复制
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

示例

代码语言:javascript
复制
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())

输出

代码语言:javascript
复制
EventLoop delay 0.0013
EventLoop delay 1.0026
EventLoop delay 0.0014
EventLoop delay 0.0015
票数 7
EN

Stack Overflow用户

发布于 2019-12-19 21:22:07

对于2019年阅读这篇文章的人来说,这可能是一个更好的答案:雅皮。使用Yappi版本的1.2.1>=,您可以本机分析协同,并准确地查看在协同线中花费了多少墙或cpu时间。

有关此协同线分析的详细信息,请参阅这里

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38856410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档