Pygame и Threading: заблокированы при доступе к глобальным? - PullRequest
1 голос
/ 22 февраля 2010

Я программирую игру, используя 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 Ответ

3 голосов
/ 23 февраля 2010

Я не могу проверить, действительно ли у вас возникла проблема с потоком / параллелизмом, хотя это кажется вероятным. Я могу предложить решение, которое может решить его.

Модуль многопроцессорной обработки python демонстрирует, как порождать новый процесс (не поток) с очередью. Если вы создаете новый процесс и затем запускаете там OSC, а обработчик просто помещает сообщение в очередь всякий раз, когда что-то приходит, вы можете затем опросить очередь из основного процесса pygame, чтобы получить любые поступившие сообщения.

Это немного менее чисто, чем вы хотели бы, но по крайней мере он получит два модуля на расстоянии вытянутой руки, чтобы они не могли мешать друг другу.

...