当使用Python的asyncio
包时,我注意到我不能单步执行tasks.Task
类的任何代码。例如,当调用代码调用类的构造函数时,我的下一个“单步执行”将使我进入类外的get_debug()
函数。在那之后,我返回到调用代码,其中包含一个初始化的Task
对象。我在Task.__next_step()
中观察到类似的行为:我将单步执行此方法调用的代码。
我测试的所有Python版本(3.9、3.10)、IDE(PyCharm、Visual Studio Code)和操作系统(macOS、Windows)都出现了同样的问题。
有人知道调试器奇怪行为的原因吗?可能的话,如何克服它?
屏幕截图最后一行中的call_soon()
是从Task.__init__
内部发出的。
更新:令人惊讶的是,使用Python 3.6(iPadOS上的Pythonista),我可以从base_events.BaseEventLoop.create_task()
进入Task.__init__
。
2条答案
按热度按时间wztqucjr1#
Task
的实作是以C(如果有的话)执行。调试工具无法逐步执行C程式码。您可以在
asyncio.tasks
模块中看到这一点:最后一行显示了Python实现被C实现覆盖。
您可以通过检查
Task
的__module__
属性来验证您的实现。例如:一个纯Python实现将打印
asyncio.tasks
,而C实现将打印_asyncio
。ubof19bj2#
Python的
asyncio
需要启用调试模式。我使用的方法是将环境变量
PYTHONASYNCIODEBUG
设置为1
,但也有其他方法。请查看此文档,您将找到所有您想了解的关于asyncio
调试的信息。