рассмотрят следующие объекты:Изменение свойств объекта в Python мультипроцессорных
class Item(object):
def __init__(self):
self.c = 0
def increase(self):
S.increase(self)
class S(object):
@staticmethod
def increase(item):
item.c += 1
Это отражает ситуацию, я нахожусь в данный момент, S некоторый класс библиотеки, пункт собирает и организует процессы данных и манипулирования данных. Теперь я хочу parallelise работу, для этого я использую модуль Python многопроцессорной:
from multiprocessing import Process
l= [Item() for i in range(5)]
for i in l:
Process(target=i.increase).start()
В результате это не то, что я ожидал:
[i.c for i in l]
[0, 0, 0, 0, 0]
Где я буду неправильно?
Это не имеет никакого отношения к использованию статических методов, а скорее к тому, как работает многопроцессорный модуль. Когда вы начинаете новый «Процесс», он получает * копию * каждого объекта «i». Например, http://stackoverflow.com/questions/3044580/multiprocessing-vs-threading-python?rq=1. Чтобы получить обратно мутированный объект, вы должны либо отправить его обратно из процесса, либо поместить его в общую область: https://docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes – torek
Это, кажется, проблема, если вы отправляете ее в качестве ответа, я могу дать вам знак! Большое спасибо! – Kai