Начало работы с многопроцессорностью в Python - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь настроить многопроцессорность в моем скрипте: я хочу пройтись по массиву и запустить функцию для каждого элемента в массиве, но я хочу, чтобы эта функция вызывалась одновременно.

Это оригинальная установка:

def my_function(my_variable):
    #DO stuff
    return my_variable_updated

def main():
    #initialize my_variable as a list with 10000 items
    results = []
    for item in my_variable:
    results.append(my_function(item))

    #continue script

Как я могу преобразовать это в многопроцессорность, чтобы я мог запустить несколько my_functions одновременно и быстрее перейти к "#continue script"? Нужно ли использовать queue для этого?

1 Ответ

0 голосов
/ 20 апреля 2019

Вам придется довольно тщательно реструктурировать свой скрипт, чтобы реализовать multiprocessing.Основной сценарий будет выглядеть примерно так:

from multiprocessing import Process, JoinableQueue, Manager

def my_function(input_queue, manager_list):
    while True:
        item_to_process = input_queue.get() # item_to_process will be an (index, item) tuple
        result_of_processing = item_to_process[1] ** 2
        manager_list[item_to_process[0]] = result_of_processing
        input_queue.task_done()

def main():
    item_count = 10 # 10000 in your case
    my_variable = [i for i in range(item_count)]
    q = JoinableQueue()
    for index, item in enumerate(my_variable):
        q.put((index, item))
    manager = Manager()
    results = manager.list([0] * item_count) # initialize to same size as my_variable
    worker_count = 2
    for _ in range(worker_count):
        p = Process(target=my_function, args=[q, results])
        p.daemon = True # optional, but should be used unless your subprocess will spawn another process
        p.start()
    # now you can continue on
    # but when you need to access `results` you have to put:
    q.join()
    # now we have our results
    print(results)

if __name__ == "__main__":
    main()

Yeilding

[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

В моем простом случае.

Вы также можете использовать пул, но я не очень разбираюсь в этом и не хотел бы вводить вас в заблуждение.

Главное, на что нужно обращать внимание при использовании многопроцессорной обработки, - это избегатьвзаимоблокировки, а также поддержание разделяемой памяти, и это может быть сложно быстро!В большинстве случаев было бы достаточно и рекомендуется вместо этого использовать threading.Thread!Этот модуль очень прост в использовании, но вам все равно, вероятно, понадобится queue.Queue.Однако вам не придется беспокоиться о совместном использовании памяти и таких вещах, как multiprocessing.Manager s

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