Pygame和线程:访问全局时锁定?

时间:2010-02-22 12:09:58

标签: python multithreading pygame osc

我正在使用pygame编写游戏。我打算使用OpenSoundControl(OSC)控制其中一个字符,这是一个基于udp的实时通信协议。基本上我使用simpleOSC模块将一些OSC命令用于我的pygame程序上的函数。

我的游戏结构是这样的(这是一个简化,所以你明白了):

globalsomething = {}

def handler(*m):
    global globalsomething
    print "it works"
    print globalsomething
    print "not working"

if __name__ == "__main__":
    osc.init()
    osc.listen('', 3333)
    osc.bind(handler,'/game/dosmtng')
    app = Game()
    while True: 
        app.MainLoop()

Game是一个简单的类,它执行pygame.init()并绘制并执行与pygame相关的所有操作。

执行代码时遇到的问题是,当我发送一个osc数据包时,我得到“它工作”但不“不工作”,然后没有处理后续的osc数据包。

由于simpleOSC使用线程,我对这种行为的唯一解释是pygame使用某种不兼容的线程(?),并且当试图访问位于pygame线程中的变量时它会锁定。

关于原因和(如果可能的话)解决方案的任何想法?

1 个答案:

答案 0 :(得分:3)

我无法验证您是否确实存在线程/并发问题,尽管看起来很可能。我可以建议一个可以解决它的解决方案。

python多处理模块演示了如何使用队列生成新进程(而不是线程)。如果您创建新进程然后在其中初始化OSC,并且让处理程序只是在到达时简单地在队列上放置消息,则可以从主pygame进程轮询队列以获取已经进入的任何消息。

它比你想要的要干净一点,但至少它会让两个模块在臂长,这样它们就不会相互干扰。