Общие переменные между несколькими процессами в Python

Python

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

Однако стандартная библиотека Python уже предоставляет нам эту возможность, и ее очень просто использовать. Но есть два случая: один — процесс с несколькими процессами, а другой — способ пула процессов пула.

Многопроцессный процесс

Общие переменные между несколькими процессами, определенными Process, могут напрямую использовать Value, Array, Queue и т. д. при многопроцессорной обработке Если вы хотите совместно использовать список и dict, вы можете использовать мощный модуль Manager.

import multiprocessing


def func(num):
    # 共享数值型变量
    # num.value = 2

    # 共享数组型变量
    num[2] = 9999


if __name__ == '__main__':
    # 共享数值型变量
    # num = multiprocessing.Value('d', 1)
    # print(num.value)

    # 共享数组型变量
    num = multiprocessing.Array('i', [1, 2, 3, 4, 5])
    print(num[:])

    p = multiprocessing.Process(target=func, args=(num,))
    p.start()
    p.join()

    # 共享数值型变量
    # print(num.value)

    # 共享数组型变量
    print(num[:])

Пул процессов пула

Вышеупомянутый метод нельзя использовать для общих переменных между пулами процессов, поскольку отношение процессов в пуле процессов не является процессом родитель-потомок.Если вы хотите совместно использовать, вы должны использовать модуль диспетчера для его определения.

from multiprocessing import Pool, Manager


def func(my_list, my_dict):
    my_list.append(10)
    my_list.append(11)
    my_dict['a'] = 1
    my_dict['b'] = 2


if __name__ == '__main__':
    manager = Manager()
    my_list = manager.list()
    my_dict = manager.dict()

    pool = Pool(processes=2)
    for i in range(0, 2):
        pool.apply_async(func, (my_list, my_dict))
    pool.close()
    pool.join()

    print(my_list)
    print(my_dict)

Еще одно замечание: при совместном использовании списков написание функции, подобной следующей, не работает.

def func(my_list, my_dict):
    my_list = [10, 11]
    my_dict['a'] = 1
    my_dict['b'] = 2

Запись таким образом эквивалентна переопределению локальной переменной и не влияет на исходный список, поэтому необходимо использовать такие методы, как append и extend.

Справочная документация:

blog.CSDN.net/Post-Evolution 1/…