Процесс метода класса не меняет атрибуты объектов
Это мой второй день в Python, я обнаружил, что это действительно классный язык, и я хочу попробовать в нем разные вещи.
Можно ли вызвать объект и создать демон метода этого объекта, который изменил бы атрибуты объекта?
from multiprocessing import Process
import time
class Foo(object):
def __init__(self):
self.number = 1
# this attribute...
def loop(self):
while 1:
print self.number
# ...is changed here
self.number += 1
time.sleep(1)
if __name__ == '__main__':
f = Foo()
p = Process(target=f.loop)
p.deamon = True # this makes it work in the background
p.start()
# proceed with the main loop...
while 1:
time.sleep(1)
print f.number * 10
Результат:
1
10
2
10
3
10
4
10
...
Почему не f.loop()
изменить self.number
из f
? Они оба являются частью одного класса Foo()
,
Что я могу изменить, чтобы получить этот вывод:
1
10
2
20
3
30
4
40
...
/ редактировать 1:
Я попробовал это, с тем же результатом (почему?):
class Foo(Process):
def __init__(self):
super(Foo, self).__init__()
self.daemon = True # is daemon
self.number = 1
self._target = self.loop # on start() it will run loop()
def loop(self):
while 1:
print self.number
self.number += 1
time.sleep(1)
if __name__ == '__main__':
f = Foo() # is now Process
f.start() # runs f.loop()
while 1:
time.sleep(1)
print f.number * 10
Тот же вывод, что и раньше.
1 ответ
Вы используете multiprocessing
, Короткий (и несколько упрощенный) ответ заключается в том, что процессы по умолчанию не разделяют память. Попробуйте использовать threading
вместо.
Если вы одержимы экспериментами с общей памятью и процессами, посмотрите на состояние общего доступа в документации по многопроцессорности.
Также daemon
не делает то, что вы думаете, что делает. Если процесс создает потомков, он будет пытаться убить всех своих демонических потомков при выходе из него. Все процессы будут работать в фоновом режиме, вам просто нужно их запустить.