Multiprocessing Manager Dict не обновляется - PullRequest
0 голосов
/ 27 мая 2020

Я пытался зафиксировать время начала и окончания каждого процесса, передав Manager.dict. Когда я использую fun , он работает не так, как ожидалось, но для fun_1 он работает. Я запускаю этот код на python 3.7 (IDE VS Code)

import time
from multiprocessing import Manager
from multiprocessing.pool import Pool


def fun(a, d):
    if a not in d:
        d[a] = list()

    d[a].append(time.time())
    time.sleep(1)
    d[a].append(time.time())


def fun_1(a, d):

    s = time.time()
    time.sleep(1)
    e = time.time()
    d[a] = [s, e]


if __name__ == '__main__':
    pool = Pool(4)
    m = Manager()
    d = m.dict()
    pool.starmap(fun, [(i, d) for i in range(10)])
    print(d) # {3: [], 0: [], 2: [], 1: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: []}

Похоже, мне чего-то не хватает. Заранее спасибо

1 Ответ

1 голос
/ 27 мая 2020

В этой ветке объясняется ваша проблема: https://bugs.python.org/issue36119

Чтобы решить эту проблему, вы должны либо выполнить операцию __setitem__, позволяющую системе заметить изменение в объекте, который распространяется на объект общего менеджера. Вот почему ваше fun_1 работает так же, как ваше исполнение d[a] = [s,e].

Другой вариант заключается в том, что вы можете заранее определить объекты manager.list () вместо обычных объектов списка, которые должны работать так, как вы ожидаете от них в этой ситуации.

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