почему преобразованный массив tolist не добавляется в python многозадачной обработке? - PullRequest
1 голос
/ 06 марта 2020

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

Я ожидал [8] в строке 1 после обработки, но это не так т изменить. Кто-нибудь может помочь? Большое спасибо.

Вот код:

from multiprocessing import Process, Manager
import numpy as np
def f(L, L1):
    row = L
    row.append([4])
    L = row
    row1 = L1
    row1.append([8])
    L1 = row1

if __name__ == '__main__':
    manager = Manager()

    lst = manager.list()
    lst.append([1])
    lst.append([2])               
    lst.append([3])               
    print('lst main before: ', lst)

    a = np.array([[5],[6]])
    lst1 = manager.list()
    lst1 = np.array(a).tolist()
    lst1.append([7])
    print('lst1 main before: ', lst1)

    p = Process(target=f, args=(lst,lst1))
    p.start()
    p.join()
    print('lst main after: ', lst)
    print('lst1 main after: ', lst1)

Вывод

lst main before:  [[1], [2], [3]]
lst1 main before:  [[5], [6], [7]]
lst main after:  [[1], [2], [3], [4]]
lst1 main after:  [[5], [6], [7]]

1 Ответ

1 голос
/ 06 марта 2020

Посмотрите на это:

    lst1 = manager.list()
    lst1 = np.array(a).tolist()

Первый оператор составляет lst1 a Manager список. Но второе утверждение заменяет его обычным списком, он больше не Manager.

. Сначала вы должны создать список, а затем сделать его управляемым.

    lst1 = np.array(a).tolist()
    lst1 = manager.list(lst1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...