我有一个运行弹球机的Python应用程序。它需要以相当一致的循环速度运行以进行弹球类型的操作,但是我还需要能够在整个游戏的各个点上加载图像和声音。我没有足够的内存来预加载整个游戏所需的所有声音文件,因此我希望在主游戏循环继续时使用其他线程(或多个线程)在后台加载它们。在长时间运行的应用程序中使用临时线程?
使用Python的threading
模块很容易,因为使用Queue.Queue
来维护需要加载的资产列表。我的问题是,如果资产加载器线程始终运行,是否“OK”(缺少更好的单词),或者我是否应该在需要时创建线程,然后在完成时让它结束。在我的情况下,弹球机和我的Python应用程序一次将运行数小时(或数天)。
所有Python线程的示例我发现它们倾向于应用程序执行某些操作,然后结束,而不是为长时间运行的应用程序创建(可能)临时线程。
在我来说,我想我有两个选择:
选项1,其中装载机线程运行永远:
self.loader_queue = Queue.Queue
def loader_thread(self):
while True:
do_my_work(self.loader_queue.get())
选项2,其中装载机线头当队列为空:
def loader_thread(self):
while not self.loader_queue.empty():
do_my_work(self.loader_queue.get())
很显然,我已经留下了一些东西出来。有些try:
块和创建选项2线程的方法,但是我觉得这些片段解释我两个选项。
我真正的问题是,使用选项1,是“坏”,因为那么我就浪费了一半的Python执行周期,而加载程序线程只是旋转并且对于99.99%的排队时间没有做任何事情空?
或者是这种情况下,我应该使用第一个选项,但使用self.loader_queue.get(block=True)
?我假设如果我的加载程序线程在等待队列中的项目时只是阻塞,那么这是一种有效的等待类型,我不会浪费一堆循环吗?
谢谢! 布赖恩