Ошибка с параметром настройки для класса Python, унаследованного от многопроцессорности. Процесс

Почему этот код

import multiprocessing import time class Bot(multiprocessing.Process): def __init__(self): self.val = 0 multiprocessing.Process.__init__(self) def setVal(self): self.val = 99 def run(self): while True: print 'IN: ', self.val time.sleep(2) if __name__ == '__main__': bot = Bot() bot.start() bot.setVal() while True: print 'OUT: ', bot.val time.sleep(2) 

дает следующий результат?

 OUT: 99 IN: 0 OUT: 99 IN: 0 OUT: 99 IN: 0 OUT: 99 IN: 0 OUT: 99 IN: 0 OUT: 99 IN: 0 ... 

Как вы можете догадаться, я ожидаю получить все 99, IN и OUT. Но я не. Зачем? Что мне не хватает?

3 Solutions collect form web for “Ошибка с параметром настройки для класса Python, унаследованного от многопроцессорности. Процесс”

Проблема в том, что после запуска второго процесса вы печатаете из двух разных процессов.

Родительский процесс имеет исходный экземпляр бота, значение которого равно 99. Родительский процесс – это распечатка OUT, поэтому вы получаете значение 99.

Подпроцесс (новый) начинается с состояния, скопированного с объекта бота, как это было, когда вы вызывали метод многопроцессорной обработки start() . Из-за этого он имеет состояние 0. Вы никогда не вызываете setVal в подпроцессе, поэтому оно остается 0, а IN печатает 0.

Если вы хотите поделиться информацией о состоянии, подобной этому между родительским процессом и подпроцессом, прочитайте это: http://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes

Когда вы вызываете start() на свой объект, материал внутри этого объекта запускается в отдельном процессе, и использование методов этого класса для «общения» с ним на самом деле не самый лучший способ. То, что вам нужно сделать, называется межпроцессорной коммуникацией (короткое короткое IPC), и есть специальная техника для правильной работы.

Для multiprocessing модуля Python существуют два механизма для обмена данными между процессами: Pipe и Queue . Я бы предложил изучить их (например, здесь ).

Чтобы использовать механизм Pipe в вашем примере, вы можете сделать это таким образом (просто краткая иллюстрация):

 class Bot(multiprocessing.Process): def __init__(self, pipe): multiprocessing.Process.__init__(self) self.val = 0 self.ipcPipe = pipe def run(self): while True: newData = self.ipcPipe.recv() self.val = newData[0] print 'IN: ', self.val self.ipcPipe.send([self.val]) time.sleep(2) if __name__ == '__main__': parent_conn, child_conn = multiprocessing.Pipe() bot = Bot(child_conn) bot.start() value = 0 while True: value += 1 parent_conn.send([value]) outVal = parent_conn.recv() print 'OUT: ', outVal[0] time.sleep(2) 

Посмотрите, что было сделано здесь: мы создаем «концы» родителя и ребенка в Pipe и даем ребенку конец вашему объекту. Затем из родительского процесса вы используете send() для передачи нового значения объекту и recv() для получения обновленного значения. Точно так же внутри вашего объекта (отдельный процесс, помните) вы наоборот используете send() и recv() на другом конце трубы для связи с родительским процессом.

Кроме того, я бы рекомендовал вызвать Process.__init__(self) в вашем классе __init__ перед тем, как выполнить любую другую инициализацию. Так как вы наследуете от Process , это хорошая идея, чтобы убедиться, что все элементы процесса под капотом правильно инициализируются, прежде чем делать что-либо в своем классе.

Надеюсь это поможет.

 bot = Bot() # creates a bot object in this process bot.start() # creates an other process and creates a bot object there 

Это два разных объекта. Если вы хотите посмотреть, как разделить состояние между двумя процессами: http://docs.python.org/2/library/multiprocessing.html#namespace-objects

Или в трубах, предлагаемых DMH: http://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes

Python - лучший язык программирования в мире.