Python одновременно заполняет список - PullRequest
0 голосов
/ 04 сентября 2018

Итак, я пытаюсь написать многопроцессорный код, который, надеюсь, заполнит список, основанный на некоторых запущенных процессах. Но это совсем не изменяет список.

Теперь я знаю, что не могу получить доступ к одному и тому же элементу и увеличить его из нескольких потоков, потому что это приведет к условиям гонки. Но у меня есть код, который обращается к ОДНОМУ индексу из ОДНОГО и только одного процесса. Так, например, если у меня есть список из 4 элементов, я запускаю 4 процесса, по одному процессу для каждого элемента. Это, однако, не работает. Хотя я читал, что списки предположительно поточно-ориентированы.

Я написал небольшую программу, демонстрирующую мою проблему:

from multiprocessing import Process

list = [0,0,0,0]

def incrAt(idx):
    list[idx] += 1


p0 =  Process(target = incrAt, args=(0,))
p1 =  Process(target = incrAt, args=(1,))
p2 =  Process(target = incrAt, args=(2,))
p3 =  Process(target = incrAt, args=(3,))

p0.start()
p1.start()
p2.start()
p3.start()

# Do stuff while we wait...

p0.join()
p1.join()
p2.join()
p3.join()


print(list) # should print [1,1,1,1] but prints [0,0,0,0]

1 Ответ

0 голосов
/ 04 сентября 2018

Это потому, что глобальные переменные не являются общими для процессов.

Использовать multiprocessing.Manager.list -

from multiprocessing import Process, Manager

def incrAt(idx, lis):
    lis[idx] += 1
with Manager() as manager:
    lis = manager.list([0, 0, 0, 0])
    p0 =  Process(target = incrAt, args=(0,lis))

Переименовал ваш список из списка в lis, так как список встроен в python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...