Использование многопроцессорного_процессора Python для управления одним и тем же целым числом

проблема

Я использую многопроцессорный модуль Python для выполнения функций асинхронно. То, что я хочу сделать, – это отслеживать общий ход моего скрипта, поскольку каждый процесс вызывает и выполняет def add_print . Например, я хотел бы, чтобы приведенный ниже код добавлял 1 к total и распечатывал значение ( 1 2 3 ... 18 19 20 ) каждый раз, когда процесс запускает эту функцию. Моя первая попытка состояла в том, чтобы использовать глобальную переменную, но это не сработало. Поскольку функция вызывается асинхронно, каждый процесс считывает total как 0 для начала и добавляет 1 независимо от других процессов. Таким образом, выход равен 20 1 вместо добавочных значений.

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

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация, или если я не объясню что-то достаточно хорошо.

Благодаря!


Код

 #!/usr/bin/python ## Import builtins from multiprocessing import Pool total = 0 def add_print(num): global total total += 1 print total if __name__ == "__main__": nums = range(20) pool = Pool(processes=20) pool.map(add_print, nums) 

One Solution collect form web for “Использование многопроцессорного_процессора Python для управления одним и тем же целым числом”

Вы можете использовать общее Value :

 import multiprocessing as mp def add_print(num): total.value += 1 print(total.value) def setup(t): global total total = t if __name__ == "__main__": total = mp.Value('i', 0) nums = range(20) pool = mp.Pool(initializer=setup, initargs=[total]) pool.map(add_print, nums) 

Инициализатор пула устанавливает setup один раз для каждого подпроцесса рабочего. setup делает total глобальную переменную в рабочем процессе, поэтому total может быть доступна внутри add_print когда рабочий вызывает add_print .

Обратите внимание, что количество процессов не должно превышать количество процессоров вашего компьютера. Если вы это сделаете, избыточные подпроцессы будут ждать, пока CPU станут доступными. Поэтому не используйте processes=20 если у вас нет 20 или более процессоров. Если вы не укажете аргумент processes , multiprocessing будет определять количество доступных ЦП и создать пул с множеством рабочих для вас. Количество задач (например, длина nums ) обычно значительно превышает количество процессоров. Хорошо; задачи ставятся в очередь и обрабатываются одним из рабочих, когда рабочий становится доступным.

Python - лучший язык программирования в мире.