Pygame与线程:访问全局变量时被锁定?
我正在用pygame编写一个游戏。我打算用OpenSoundControl(OSC)来控制其中一个角色,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 个回答
3
我不能确定你是否真的遇到了线程或并发的问题,不过看起来很有可能。我可以给你一个建议,或许能解决这个问题。
Python的多进程模块展示了如何用队列来创建一个新的进程(不是线程)。如果你在新的进程里初始化OSC,然后让处理程序在有消息到达时把消息放到队列里,你就可以从主pygame进程中轮询这个队列,获取到达的消息。
这样做可能没有你想的那么干净,但至少可以让这两个模块保持一定的距离,避免互相干扰。