在电子纸屏幕上显示静态内容时,避免繁忙或低效等待的适当策略?
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
我的应用程序使用各种“插件”对象更新电子纸屏幕。每个对象代表一个模块,它有自己的工作人员来创建图像。图像显示一段时间,然后切换到队列中的下一个。每个对象都有自己的计时器,该计时器取决于与其关联的工作人员生成的数据。该计时器可以响应各种外部输入而改变(例如,用户开始播放音乐、出现天气警报)。
工作人员排队,一次性更新,需要的时候更新到屏幕上。
我目前在 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