Совместное использование переменных между несколькими потоками в 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.
Справочная документация: