For AI agents: the complete documentation index is available at /llms.txt, the full documentation bundle is available at /llms-full.txt, and this page is available as Markdown at /developers/asyncio_index.md.

异步编程

2016 年 9 月 29 日,我们在双周发布计划中发布了 Home Assistant 0.29。该版本引入了由 Ben Bangert 主导的 core 全面改造。

旧的 core 像传统的线程应用一样设置。每个非线程安全的资源(例如 entity 的状态)都会受到锁的保护。这导致了大量等待和潜在的不一致性,因为一个任务可能在执行一半时等待,直到某个资源被释放。

我们的新 core 基于 Python 内置的 asyncio 模块。不再让所有线程都能访问 core API 对象,现在访问仅限于一个称为 event loop 的特殊线程。所有组件现在都会将自己调度为一个由 event loop 执行的任务。这保证了同时只有一个任务在执行,意味着我们不再需要任何锁。

将所有内容放在 event loop 内运行的唯一问题是,当任务执行阻塞 I/O 时;大多数第三方 Python 库都会这样做。例如,在向设备请求新信息时,core 将停止运行,直到我们收到设备的响应。为了处理这个问题,任务可以挂起自身,直到响应可用,然后将其排入 event loop 以处理结果。

为了使任务能够挂起自身,它所调用的所有代码都必须支持此功能。实际上,这意味着每个设备集成都需要对提供该集成的库进行完整重写!由于这是永远无法实现的事情,因此添加了一个 100% 向后兼容的 API,这样就没有平台需要更新。

向后兼容的 API 会在不同的线程中调度任务,并阻塞该线程,直到 event loop 处理完该任务。