Python在线程中加载动画导致分段错误
下面是我创建的代码,使用pyglet.resource.animation()函数在后台加载动画,而应用程序执行其他一些操作Python在线程中加载动画导致分段错误,python,segmentation-fault,python-multithreading,pyglet,Python,Segmentation Fault,Python Multithreading,Pyglet,下面是我创建的代码,使用pyglet.resource.animation()函数在后台加载动画,而应用程序执行其他一些操作 import pyglet import threading animations = dict() class LoadingThread(object): def __init__(self): thread = threading.Thread(target=self.run, args=()) thread.start(
import pyglet
import threading
animations = dict()
class LoadingThread(object):
def __init__(self):
thread = threading.Thread(target=self.run, args=())
thread.start() # Start the execution
def run(self):
""" Method that runs forever """
loadAnimations()
print("Loaded all animations.")
def loadAnimations():
global animations
print("In loadAnimations")
for animation in os.listdir(os.getcwd()):
if animation.endswith(".gif"):
print(animation)
#Gives segmentation fault here
animations[animation] = pyglet.resource.animation(animation)
print("Loaded animations")
thread = LoadingThread()
在没有线程的情况下正常调用时运行良好。
如果有任何其他方法来处理在pyglet后台加载动画,请建议
谢谢。正如@Frank Merrow所建议的那样。这里的问题是我在使用这个函数
pyglet.resource.animation(“filename.gif”)
也在我的主线程中运行。因此,它造成了分割错误。
我发现了另一个可以加载动画的函数
pyglet.image.load\u动画(“filename.gif”)
用这个解决了我的问题
这个问题也可以通过启动两个线程来解决,同步运行主流和后台工作。正如@Frank Merrow所建议的那样。这里的问题是我在使用这个函数
pyglet.resource.animation(“filename.gif”)
也在我的主线程中运行。因此,它造成了分割错误。
我发现了另一个可以加载动画的函数
pyglet.image.load\u动画(“filename.gif”)
用这个解决了我的问题
此外,通过启动两个线程同步运行主流和后台工作,也可以解决此问题。可能是与此相关的GIL问题。看到了答案,但仍然不知道如何使用它,因为我正在使用pyglet制作动画,而不是Gtk。我不太了解pyglet,抱歉。那么故障是否为您提供了导致问题的对象的任何指示?一般来说,虽然python字典是“线程安全的”,但它们不是“线程感知的”。因此,例如,如果您测试字典中是否存在某个项,然后使用您测试的项,则该项可能不再存在于字典中。您需要拥有自己的锁,以确保对对象的两次访问都是在字典不发生变化的情况下完成的。分段错误发生在第``animations[animation]=pyglet.resource.animation(animation)``行,因为在字典中填充了所有动画之前,我不会使用字典,程序的其他部分没有使用它。可能是与GIL相关的问题,谢谢。看到了答案,但仍然不知道如何使用它,因为我正在使用pyglet制作动画,而不是Gtk。我不太了解pyglet,抱歉。那么故障是否为您提供了导致问题的对象的任何指示?一般来说,虽然python字典是“线程安全的”,但它们不是“线程感知的”。因此,例如,如果您测试字典中是否存在某个项,然后使用您测试的项,则该项可能不再存在于字典中。您需要拥有自己的锁,以确保对对象的两次访问都是在字典不发生变化的情况下完成的。分段错误发生在第``animations[animation]=pyglet.resource.animation(animation)``行,因为在字典中填充了所有动画之前,我不会使用字典,程序的其他部分都没有使用它。