Python异步:无法调试到任务类

k75qkfdt  于 2022-10-30  发布在  Python
关注(0)|答案(2)|浏览(135)

当使用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__

wztqucjr

wztqucjr1#

Task的实作是以C(如果有的话)执行。调试工具无法逐步执行C程式码。
您可以在asyncio.tasks模块中看到这一点:

class Task(futures._PyFuture):
    ...

_PyTask = Task

try:
    import _asyncio
except ImportError:
    pass
else:
    # _CTask is needed for tests.
    Task = _CTask = _asyncio.Task

最后一行显示了Python实现被C实现覆盖。
您可以通过检查Task__module__属性来验证您的实现。例如:

import asyncio
print(asyncio.Task.__module__)

一个纯Python实现将打印asyncio.tasks,而C实现将打印_asyncio

ubof19bj

ubof19bj2#

Python的asyncio需要启用调试模式。
我使用的方法是将环境变量PYTHONASYNCIODEBUG设置为1,但也有其他方法。请查看此文档,您将找到所有您想了解的关于asyncio调试的信息。

相关问题