Процесс метода класса не меняет атрибуты объектов

Это мой второй день в 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 не делает то, что вы думаете, что делает. Если процесс создает потомков, он будет пытаться убить всех своих демонических потомков при выходе из него. Все процессы будут работать в фоновом режиме, вам просто нужно их запустить.

Другие вопросы по тегам