Прежде всего, многопроцессорность означает, что вы создаете подпроцессы. Это означает, что в целом у них есть свое место в памяти и они не разговаривают друг с другом. Для ясности: когда вы запускаете новый многопроцессорный поток, python копирует все ваши глобальные переменные в этот поток, а затем запускает этот поток отдельно от всего остального. Итак, когда вы создали свои два процесса, change_var и print_var, каждый из них получил копию self, а поскольку это две копии self, ни один из них не разговаривает с каждым. Один поток обновляет свою собственную копию и выдает подсчитываемые ответы, другой не обновляет себя. Вы можете легко проверить это самостоятельно:
import multiprocessing as mp
LIST = [] # This list is in parent process.
def update(item):
LIST.append(item)
p = mp.Process(target=update, args=(5,)) # Copies LIST, update, and anything else that is global.
p.start()
p.join()
# The LIST in the sub-process is cleaned up in memory when the process ends.
print(LIST) # The LIST in the parent process is not updated.
Было бы очень опасно, если бы разные процессы обновляли переменные друг друга, когда они пытались обрабатывать их; следовательно, естественно, чтобы изолировать их (и предотвратить «ошибки сегментации»), все пространство имен копируется. Если вы хотите, чтобы подпроцессы общались друг с другом, вам необходимо связаться с менеджером и Очередью, которые предназначены для этого.
Я лично рекомендую вместо этого писать свой код вокруг таких вещей, как Pool (). Очень чисто, введите массив, верните массив, готово. Но если вы хотите go в кроличью нору, вот что я прочитал на веб-сайте, посвященном многопроцессорной обработке.
import multiprocessing as mp
def f(queue):
queue.put(['stuff',15])
def g(queue):
queue.put(['other thing'])
queue = mp.Queue()
p = mp.Process(target=f,args=(queue,))
q = mp.Process(target=g,args=(queue,))
p.start()
q.start()
for _ in range(2):
print(queue.get())
p.join()
q.join()
Основная идея заключается в том, что очередь не копируется, а вместо этого позволяет оставлять вещи в очереди. Когда вы запускаете queue.get (), он ждет, пока в очереди не будет получено что-то, что было оставлено каким-то другим процессом. queue.get () блокируется и ждет. Это означает, что вы можете заставить один процесс читать содержимое другого процесса, например:
import multiprocessing as mp
def f(queue):
obj = queue.get() # Blocks this sub-process until something shows up.
if obj:
print('Something was in the queue from some other process.')
print(obj)
def g(queue):
queue.put(['leaving information here in queue'])
queue = mp.Queue()
p = mp.Process(target=f,args=(queue,))
q = mp.Process(target=g,args=(queue,))
p.start()
Это довольно круто, поэтому я рекомендую подождать здесь секунду, чтобы подумать о том, что ожидает обработки. Затем запустите процесс q.
q.start()
Обратите внимание, что p не дошел до завершения sh обработки, пока не был запущен q. Это потому, что Очередь заблокирована и ждала, чтобы что-то появилось.
# clean up
p.join()
q.join()
Подробнее см .: https://docs.python.org/3.4/library/multiprocessing.html?highlight=process#multiprocessing .Queue