Как вы разделяете многомерный массив между процессами? - PullRequest
1 голос
/ 17 марта 2020

Мой текущий проект требует использования нескольких процессов. Мне нужно разделить массив между этими процессами. Массив должен иметь возможность записи в любое время. И массив должен иметь несколько измерений. (пример: [["test", 2], [87209873, "howdy"]]) Я уже несколько часов ищу ответ на этот вопрос, но ничего не могу найти. Пожалуйста помоги. Заранее спасибо!

Ответы [ 2 ]

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

Попробуйте:

from multiprocessing import Pool, Manager                                         

def worker(v, array):                                                             
    array.append(["test", v])                                                     

def main():                                                                       
    foo = [["test", 2], [87209873, "howdy"]]                                      

    array = Manager().list(foo)                                                   

    with Pool(processes=4) as pool:                                               
        pool.starmap(worker, [(i, array) 
            for i in range(4)])                      

    print(array)                                                                  

if __name__ == "__main__":                                                        
    main()

[EDITED]

Если вы хотите, чтобы основная программа продолжала работать, во время вычисления, объединяйте пулы в отдельный поток:

from multiprocessing import Pool, Manager                                         
from threading import Thread                                                      

def _worker(v, array):                                                            
    for i in range(10000):                                                        
        array.append(["test", v])                                                 

def processor(array):                                                             
    with Pool(processes=4) as pool:                                               
        pool.starmap(_worker, [(i, array) 
            for i in range(4)])                     

def main():                                                                       
    foo = [["test", 2], [87209873, "howdy"]]                                      
    array = Manager().list(foo)                                                   
    t = Thread(target=processor, args=(array,))                                   

    t.start()                                                                     

    print("Good day!")    

    # Wait, while thread ends.
    # Without doing it, you'll print array, 
    # not knowing when the thread ended.
    t.join()

    print(array)                                                    

if __name__ == "__main__":                                                        
    main()
0 голосов
/ 17 марта 2020

Прежде всего, list не является array, если вы хотите разделить list между различными процессами, вы можете использовать Manager из модуля multiprocessing, например:

import multiprocessing as mp


def remove_last_element(mp_list: list):
    mp_list.pop()


def append_list(mp_list: list):
    mp_list.append([12, 'New Hello'])


if __name__ == "__main__":
    mp_list = mp.Manager().list()
    mp_list.append(['Hello'])
    print("before multiprocessing:", mp_list)

    worker1 = mp.Process(target=remove_last_element, args=(mp_list,))
    worker2 = mp.Process(target=append_list, args=(mp_list,))

    worker1.start()
    worker2.start()

    worker1.join()
    worker2.join()

    print("after multiprocessing:", mp_list)

>>> before multiprocessing: [['Hello']]
>>> after multiprocessing: [[12, 'New Hello']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...