2015-10-07 4 views
1

Это мой второй день на 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 

Такой же выход, как и раньше.

ответ

2

Вы используете multiprocessing. Короткий (и несколько упрощенный) ответ заключается в том, что процессы не делят память по умолчанию. Вместо этого попробуйте использовать threading.

Если вы намереваетесь экспериментировать с разделяемой памятью и процессами, посмотрите на документацию по многопроцессорной обработке на sharing state.

Также daemon не делает, что вы думаете. Если процесс создает детей, он будет пытаться убить всех его демонических детей, когда он выйдет. Все процессы будут работать в фоновом режиме, вам просто нужно их запустить.

+0

Состояние совместного использования не рекомендуется:/Кроме того, я слышал, что потоки могут испортить некоторые данные или что-то еще, если вы не будете осторожны. Я не изучал глубже. – VixinG

+0

Я, должно быть, неправильно прочитал документацию на 'deamon'. Виноват. Вместо этого попробую использовать 'threading'. Спасибо :) – VixinG

+0

Код, который вы предоставили, уже имеет состояние. Если кто-то попытался отговорить вас, ученик, используя потоки, то это та же самая причина, что и избежать общего состояния. Используйте 'threading.Lock' для совместного использования состояния. – Dunes