Pygame与线程:访问全局变量时被锁定?

1 投票
1 回答
632 浏览
提问于 2025-04-15 19:34

我正在用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进程中轮询这个队列,获取到达的消息。

这样做可能没有你想的那么干净,但至少可以让这两个模块保持一定的距离,避免互相干扰。

撰写回答