在电子纸屏幕上显示静态内容时,避免繁忙或低效等待的适当策略?

Appropriate strategy to avoid busy or inefficient waiting when displaying static content on e-paper screen?

我的应用程序使用各种“插件”对象更新电子纸屏幕。每个对象代表一个模块,它有自己的工作人员来创建图像。图像显示一段时间,然后切换到队列中的下一个。每个对象都有自己的计时器,该计时器取决于与其关联的工作人员生成的数据。该计时器可以响应各种外部输入而改变(例如,用户开始播放音乐、出现天气警报)。

工作人员排队,一次性更新,需要的时候更新到屏幕上。

我目前在 update/display 循环的末尾使用 sleep(1) 以避免在没有任何事情发生时忙于等待。是否有更好的策略来改善由此消耗的资源?通过实验,我发现通过增加 sleep() 值,此进程的 CPU 负载会下降一点(由 top 监控)。

问题:是否有更节省资源的方法来设置显示循环(见下文)?

我已经阅读了 threading and using join,但这些内容在这里似乎不合适,因为等待时间是已知的,代码不会等待某些外部资源变得可用。它只是在等待计时器到期。

这是显示循环的示例:

# list objects 
plugins = [updater_obj1, updater_obj2, updater_obj3]


plugin_cycle = itertools.cycle(plugins)
this_plugin = next(plugin_cycle)

while True:
   
   # update each object to ensure there is fresh data to display on demand
   for i in plugins:
      i.update()

   # only update the display when the object's timer has run down
   if this_plugin.timer_expired():
      this_plugin = next(plugin_cycle) # move to the next item in the list
      this_plugin.set_timer() # reset the timer
      epd.write(plugin.image) # update the E-paper display with a new image
   
   sleep(1)

添加一个类似 timer_expires() 的方法,returns 每个插件的计时器到期时间戳,然后它可以休眠直到到期,这样它就不必继续检查

while True:
   
   # update each object to ensure there is fresh data to display on demand
   for i in plugins:
      i.update()
   
   # sleep for the right amount of time
   sleep(this_plugin.timer_expires() - time())
   
   # update the display
   this_plugin = next(plugin_cycle) # move to the next item in the list
   this_plugin.set_timer() # reset the timer
   epd.write(plugin.image) # update the E-paper display with a new image