0

У меня проблема с Python с модульной многопроцессорностью. В принципе, я делаю игру (с tkinter as graphics), в которой у меня есть класс Game и несколько классов (entites), у которых есть метод обновления (self). Так что это немного похоже:Python - интеграция многопроцессорности с классами

class Game: 
  __init__(self, etc...): 
    self.entities = [] 
  gameloop(self): 
     for entity in self.entities: 
       entity.update 

class EntityExample: 
  __init__(self, game, etc...): 
    self.game = game 
  update(self): 
    #stuff 

А потом я:

game = Game() 
game.entities.append(EntityExample()) 
game.gameloop() 

Так что я попытался, чтобы оптимизировать код, чтобы сделать такую ​​вещь:

импортная многопроцессорная обработка

class Game: 
  __init__(self, etc...): 
    self.entities = [] 
    self.threads = [] 
    self.lock = multiprocessing.Lock() 
  gameloop(self): 
     for entity in self.entities: 
       entity.update 

class EntityExample: 
  __init__(self, game, etc...): 
    self.game = game 
  update(self): 
    self.game.lock.acquire() 
    #stuff 
    self.game.lock.release() 

И в gameloop:

for entity in entities: 
  t = multiprocessing.Process(target=entity.update) 
  t.start() 
  t.join 
  self.threads.append(t) 

Цель состояла в том, чтобы сделать расчеты на разных ядрах в то же время для повышения производительности, но это не работает, к сожалению. Я также прошу убить программу в IDLE: «Программа все еще работает. Вы хотите ее убить?».

Спасибо заранее,

Talesseed

P.S. : классы не подбираются

P.P.S. : Я читал, что создание нового Процесса копирует код внутри файла в новый поток, и это может быть проблемой, потому что мой код имеет длину ~ 1600 строк.

+0

Почему весь ваш код начинается с дефиса на каждой строке? –

+0

@BryanOakley Упс, я удалю это – Talesseed

+0

, ни «__init__», gameloop, ни обновление не были объявлены как функции, а обновлению не хватает self, поэтому он не является частью EntityExample –

ответ

0

Я нашел что-то интересное. Видимо, запуск его через консоль заставляет его работать. Но я провел некоторое тестирование, и многопоточная версия на самом деле медленнее, чем однопоточная версия. Я понятия не имею:/

EDIT: Nevermind, это работает сейчас, мое плохое.

Смежные вопросы