HA文档 目录

  1. 主页
  2. HA文档
  3. HA文档
  4. 开发ABC
  5. 第九课:异步工作的平台程序

第九课:异步工作的平台程序

这篇文章是系列文章的第9/11篇:

【摘要】
将上一课中的程序逻辑,以完全异步的方式实现。

【程序】

【操作】
与上一课完全相同

【知识点小结】

  1. Python中的异步、协程是个比较复杂的概念,要简短的解释清楚有点困难。大家可以看看这篇文档,我觉得写得不错:http://aju.space/2017/07/31/Drive-into-python-asyncio-programming-part-1.html
  2. 在HomeAssistant核心,整体实现了异步的方式,同时兼容非异步的模式(以线程的方式实现)。
  3. 大家如果对异步的工作模式还不是很清楚,可以做一下下面的编程实验:
    在WeatherData的async_update函数开始位置加入以下代码(在程序注释中有,去掉注释符号就可以了),其中time.sleep是阻塞程序,asyncio.sleep是非阻塞的协程。

    观察程序的界面输出(已经将无关的输出删除了):

    我们可以看到:
    -13:51:20 因为进入time.sleep,整个HomeAssistant被阻塞住没有做任何操作。
    -13:52:00 直接调用asyncio.sleep,因为这是一个协程,如果要执行必须加入到一个LOOP中,此处的调用其实是无效的(仅仅返回一个装饰器对象),所以程序完全没有被阻塞,继续执行下一句yield from asyncio.sleep。
    -13:52:00 代码yield from asyncio.sleep虽然阻止了update函数的继续执行,但其它模块的代码继续在跑着。
    -13:52:20 HomeAssistant等不及所有platform准备就绪(60秒),就只能先自己完全启动了。
    -13:52:40 yield from asyncio.sleep终于出现了结果,update继续执行
  4. 注意点:如果采用异步模式,不要引入任何可能阻塞的代码,否则整个HomeAssistant会被阻塞住;如果不以异步的模式编程,HomeAssitant会在合适的地方开线程,仅仅阻塞这个线程的执行。
  5. 注意点:一个异步协程要执行,必须yield from间接的加入到一个LOOP中,或者直接加入到一个LOOP中(比如在async_setup_platform中,设备的初始化依赖于async_update的返回值,所以加上了yield from)
  6. 注意点:与@asyncio.coroutine装饰器对应的协程调用为yield from;在python3.5之后,又加入了与@async装饰器对应的协程调用await)

【结果展现】
与上一课完全相同

遇到问题了?快来学习免费在线课程吧,博学老司机在线答疑,找到更多志同道合的HA玩家一起进步

此文不允许转载,如需转载请与BD@hachina.io联系。

这篇文章对您有用吗? 2 0