2

Вот модуль питона в пакете питона:Python: не может получить доступ к памяти изменилось с многопроцессорной

import multiprocessing as mp 

class Test(object): 
    def __init__(self): 
     self.dict = dict() 

    def fill_dict(self): 
     self.dict = {'testing': 123} 
     print self.dict 

if __name__ == "__main__": 
    tests = [Test() for i in xrange(3)] 
    jobs = [mp.Process(target=test.fill_dict, args=()) for test in tests] 
    for job in jobs: 
     job.start() 
    for job in jobs: 
     job.join() 

    print "RESULTS:" 
    for test in tests: 
     print test.dict 

я запустить модуль и получить результаты следующим образом:

C:\path\to\package>python -m package.path.to.module 
{'testing': 123} 
{'testing': 123} 
{'testing': 123} 
RESULTS: 
{} 
{} 
{} 

Из распечатки , кажется, что каждый test.dict был заполнен параллельно multiprocessing. Однако, когда я пытаюсь восстановить результаты, test.dict s кажется пустым. Может кто-нибудь объяснить, почему это происходит и что я могу сделать, чтобы восстановить непустые test.dict?

EDIT: @Valentin Лоренц, @Moinuddin Quadri, @zstewart

Даже если изменить последнюю часть модуля

if __name__ == "__main__": 
    test0 = Test() 
    test1 = Test() 
    test2 = Test() 

    jobs = list() 
    jobs.append(mp.Process(target=test0.fill_dict, args=())) 
    jobs.append(mp.Process(target=test1.fill_dict, args=())) 
    jobs.append(mp.Process(target=test2.fill_dict, args=())) 

    for job in jobs: 
     job.start() 
    for job in jobs: 
     job.join() 

    print "RESULTS:" 
    print test0.dict 
    print test1.dict 
    print test2.dict 

я получить те же результаты. Каждый процесс полностью независим от других (они не разделяют память и не нуждаются). Итак, когда ответы говорят о совместном использовании памяти между процессами, означает ли это между основным модулем и процессами многопроцессорности?

+1

Многопроцессорность запускает отдельные процессы python. Вы должны использовать multiprocessing.queue для отправки данных между процессами. – zstewart

ответ

1

Вы не можете передавать данные между потоками, используя встроенные типы. Для этого вам нужно использовать multiprocessing.Queue или mutiprocess.Pipes. Проверьте: Exchanging objects between processes.

Вы можете обратиться: Running multiple asynchronous function and get the returned value of each function. Он имеет пример о том, как использовать Queue() вместо list.

1

Процессы не делят память по умолчанию. Это нарочно, потому что разделение памяти между потоками выполнения очень сложная тема (синхронизация между потоками, связями, ...)

Самым прямым решением вашей проблемой является явно разделить этот объект: https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes

Однако , более чистый способ - заставить вашу функцию вернуть результат и использовать multiprocessing.Pool.map для вызова функции в нескольких процессах.

 Смежные вопросы

  • Нет связанных вопросов^_^