Я пытался распараллелить процесс внутри метода класса.Когда я пытаюсь использовать Pool()
из multiprocessing
, я получаю ошибки травления.Когда я использую Pool()
из multiprocessing.dummy
, мое выполнение выполняется медленнее, чем сериализованное выполнение.
Я попытался несколько вариантов моего кода ниже, используя сообщения Stackoverflow в качестве руководства, но ни один из них не был успешным обходным путемдля описанной выше проблемы.
Например, один: если я переместу process_function
выше определения класса (глобализирую его), это не сработает, потому что я не могу получить доступ к своим атрибутам объектов.
В любом случае, мой код похож на:
from multiprocessing.dummy import Pool as ThreadPool
from my_other_module import other_module_class
class myClass:
def __init__(self, some_list, number_iterations):
self.my_interface = other_module_class
self.relevant_list = []
self.some_list = some_list
self.number_iterations = number_iterations
# self.other_attributes = stuff from import statements
def load_relevant_data:
self.relevant_list = self.interface.other_function
def compute_foo(self, relevant_list_member_value):
# math involving class attributes
return foo_scalar
def higher_function(self):
self.relevant_list = self.load_relevant_data
np.random.seed(0)
pool = ThreadPool() # I've tried different args here, no help
pool.map(self.process_function, self.relevant_list)
def process_function(self, dict_from_relevant_list):
foo_bar = self.compute_foo(dict_from_relevant_list['key'])
a = 0
for i in some_other_list:
# do other stuff involving class attributes and foo_bar
# a = some of that
dict_from_relevant_list['other_key'] = a
if __name__ == '__main__':
import time
import pprint as pp
some_list = blah
number_of_iterations = 10**4
my_obj = myClass(some_list, number_of_iterations
my_obj.load_third_parties()
start = time.time()
my_obj.higher_function()
execution_time = time.time() - start
print()
print("Execution time for %s simulation runs: %s" % (number_of_iterations, execution_time))
print()
pp.pprint(my_obj.relevant_list[0:5])
У меня есть несколько сотен словарей в соответствующем списке.Я просто хочу заполнить каждое поле 'other_key'
этих словарей из вычислительно дорогостоящего моделирования в моем самом внутреннем цикле, которое дает скалярное значение, как a
выше.Кажется, должен быть простой способ сделать это, так как в Matlab я мог бы просто исправить parfor
, и это делается автоматически.Может быть, этот инстинкт не подходит для Python.