Я предположил, что пакет многопроцессорности использует рассол для отправки вещей между процессами. Однако рассол обращает внимание на методы __getstate__
и __setstate__
объекта. Многопроцессорность, кажется, игнорирует их. Это верно? Я в замешательстве?многопроцессорное игнорирование «__setstate__»
Для репликации, установите докер, и введите в командной строке
$ docker run python:3.4 python -c "import pickle
import multiprocessing
import os
class Tricky:
def __init__(self,x):
self.data=x
def __setstate__(self,d):
self.data=10
def __getstate__(self):
return {}
def report(ar,q):
print('running report in pid %d, hailing from %d'%(os.getpid(),os.getppid()))
q.put(ar.data)
print('module loaded in pid %d, hailing from pid %d'%(os.getpid(),os.getppid()))
if __name__ == '__main__':
print('hello from pid %d'%os.getpid())
ar = Tricky(5)
q = multiprocessing.Queue()
p = multiprocessing.Process(target=report, args=(ar, q))
p.start()
p.join()
print(q.get())
print(pickle.loads(pickle.dumps(ar)).data)"
Вы должны получить что-то вроде
module loaded in pid 1, hailing from pid 0
hello from pid 1
running report in pid 5, hailing from 1
5
10
Я бы подумал, что было бы «10» «10», но вместо того, чтобы это «5» «10». Что это могло означать?
(Примечание: код отредактирован соответствует руководящим принципам программирования, как это было предложено user3667217)
Что-то пошло ужасно неправильно. Какую версию python вы используете? Я скопировал и вставил ваш точный код, запустил его и получил (5,10). –
Вы работаете с окнами, не так ли? Теперь все ясно ... –
Я немного отредактировал свой ответ. Он ведет себя по-разному на разных платформах, и, как вы указали, это команда fork, доступная в системе POSIX. – user3667217