QtAsyncio 开发者笔记¶
QtAsyncio 是一个提供 Qt 和 Python 的 asyncio 模块之间集成的模块。它允许你在 Qt 应用程序中运行 asyncio 事件循环,并从 asyncio 协程中使用 Qt API。
作为一个纯Python模块,与另一个Python模块深度集成,为QtAsyncio开发有一些与其他部分不同的有趣方面。
QtAsyncio 对比 asyncio¶
从开发者的角度来看,QtAsyncio 有一个有趣的特性。由于它的目的之一是作为 asyncio 自身事件循环的透明替代品,对于任何使用 asyncio API 的代码,QtAsyncio 将(或应该!)表现得与 asyncio 完全相同。(请注意,如果我们还有 Qt 代码,则反之不成立。)这在调试时特别方便,因为可以运行 asyncio 代码进行比较并检查预期行为。它还有助于逐步调试 QtAsyncio 和 asyncio,并比较程序流程以找出 QtAsyncio 可能出错的地方(只要它们的代码差异允许)。通常,还可以通过断言 QtAsyncio 的输出与 asyncio 的输出来实现单元测试。(请注意,这里的一个限制是 Qt 的事件循环不保证回调的执行顺序,而 asyncio 则保证。)
阶跃函数¶
在调试时,可能会花费大量时间在_step
方法中,因为它是QAsyncioTask
类中经常被调用的地方,也是协程执行的地方。你会发现它与asyncio的等效方法类似,但有一些不同。仔细阅读内联注释。一些变量和相关的代码行可能看起来无害甚至不必要,但它们提供了重要的错误修复。
保持QtAsyncio与asyncio同步¶
QtAsyncio 实现了 asyncio 的 API,这些 API 可能会随着新版本的发布而改变。由于它是标准库的一部分,因此会与新的 Python 版本保持一致。因此,检查每个新 Python 版本的 API 是否发生变化是一个良好的实践。这可能包括新的类或方法、现有函数的签名更改、弃用或完全移除。例如,事件循环策略预计将在 Python 3.13 中被弃用,并在 Python 3.15 中被移除。这种移除将需要一些小的重构,以确保 QtAsyncio.run()
函数不再使用策略机制。
asyncio 开发者指南¶
asyncio的资源不仅限于纯API文档。例如,asyncio提供了自己的开发者指南,在开发QtAsyncio时值得遵循。此外,还有扩展asyncio的文档,详细说明了在构建自己的事件循环时需要记住的几个关键点。