Это мой второй день на 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
Такой же выход, как и раньше.
Состояние совместного использования не рекомендуется:/Кроме того, я слышал, что потоки могут испортить некоторые данные или что-то еще, если вы не будете осторожны. Я не изучал глубже. – VixinG
Я, должно быть, неправильно прочитал документацию на 'deamon'. Виноват. Вместо этого попробую использовать 'threading'. Спасибо :) – VixinG
Код, который вы предоставили, уже имеет состояние. Если кто-то попытался отговорить вас, ученик, используя потоки, то это та же самая причина, что и избежать общего состояния. Используйте 'threading.Lock' для совместного использования состояния. – Dunes