Python在线程中加载动画导致分段错误

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(

下面是我创建的代码,使用pyglet.resource.animation()函数在后台加载动画,而应用程序执行其他一些操作

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)``行,因为在字典中填充了所有动画之前,我不会使用字典,程序的其他部分都没有使用它。