Почему многопроцессорная обработка открывает несколько окон pygame, несмотря на то, что не обрабатывает ничего, связанного с pygame?

avatar
Arkleseisure
30 октября 2019 в 17:06
246
1
0

Я делаю шахматную программу, используя поиск по дереву Монте-Карло, которым в будущем будет управлять нейронная сеть. Проблема на данный момент в том, что, несмотря на все мои усилия по максимизации эффективности системы, движку по-прежнему требуется 3 минуты, чтобы пройти 800 игр, необходимых для поиска. Чтобы бороться с этим, я попытался внедрить в систему некоторую многопроцессорность, чтобы она могла играть более чем в одну игру одновременно.

К сожалению, несмотря на то, что он находится в отдельном файле, который импортируется в мою основную функцию, многопроцессорная обработка по-прежнему открывает дополнительные окна pygame с моей системой меню.

Вот соответствующая часть моего кода:

import multiprocessing
import time
import pygame

pygame.init()
screen = pygame.display.set_mode([800, 400])


def play_game():
    time.sleep(3)
    print("done")


if __name__ == "__main__":

    for i in range(3):
        game1 = multiprocessing.Process(target=play_game)
        game2 = multiprocessing.Process(target=play_game)
        game1.start()
        game2.start()
        game1.join()
        game2.join()

Я ожидаю, что это откроет окно pygame в начале, а затем запустит play_games и оставит код pygame в покое. Однако он открывает два дополнительных окна, по одному для каждого процесса. Почему это происходит и как этого избежать?

Источник
jasonharper
30 октября 2019 в 18:32
0

multiprocessing требует, чтобы у вас не было кода верхнего уровня за пределами блока if __name__ == "__main__":. Просто переместите две строки, связанные с pygame, в этот блок.

Arkleseisure
30 октября 2019 в 20:31
0

@jasonharper В моем реальном коде экран pygame происходит в основном коде, в то время как часть программы ai затем импортируется, так что это не так просто, хотя это работает в тестовом коде. Есть ли другой способ сделать это?

Kingsley
30 октября 2019 в 21:14
0

Вероятно, вам следует использовать библиотеку потоков, а не многопроцессорность. Многопроцессорность — это дублирование всего вашего процесса. Но FWIW в моей системе я получаю только одно окно.

Ответы (1)

avatar
Dennis.L
16 мая 2021 в 22:31
0

Я считаю, что здесь возникает та же проблема, что и у вас, и здесь есть решение:

Многопроцессорность Python: последовательное выполнение кода до и после параллельного выполнения

По сути, вам нужно переместить screen = pygame.display.set_mode([800, 400]) в __main__, чтобы он выполнялся только один раз.

Надеюсь, это немного поможет!