Python — многопроцессорная обработка с использованием функции безопасного добавления

#python #multiprocessing

#python #многопроцессорная обработка

Вопрос:

 import multiprocessing
import time
from multiprocessing import Pool
import os
class Cal:
    def add( self, num):
        added = num   3
        time.sleep(3)
        print( str(os.getppid())   " // "   str( num)   " -> "   str( added))
        return added
class Worker:
    def __init__( self, cal):
        self.cal = cal
    def run( self, param):
        return cal.add( param)

cal = Cal()
def fun( num):
    return Worker( cal).run( num)

cpuCount = multiprocessing.cpu_count()
with Pool( cpuCount) as p:
    print( p.map(fun, range(50)))
 

Я создал код, который добавляет 3 к каждому числу и возвращает их при многократной обработке. Кажется, это работает хорошо, но мне любопытно, что функция Cal.add используется надлежащим образом. экземпляр класса cal был создан сразу (проверяется pid). есть ли какой-либо способ использовать ту же память в другом потоке, который создается пулом?

Комментарии:

1. Нет, не делайте этого. Python имеет GIL, предотвращающий доступ более чем к одному ядру к одной и той же памяти, что позволяет избежать утечки памяти. Многопроцессорная обработка предназначена для использования нескольких ядер для выполнения нескольких НЕЗАВИСИМЫХ задач, по-прежнему подчиняясь GIL.

2. Экземпляр cal создается только один раз, но через fork он дублируется для каждого рабочего.

3. Что, если я создам экземпляр Cal в рабочем классе для каждого рабочего экземпляра, например, «return Cal().add (param)». это все еще небезопасно?