#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)». это все еще небезопасно?