Невозможно выбрать объекты _thread.lock при использовании multiprocessing.Pool с оболочкой Logger на основе классов.Python

Программы на Python
Anonymous
Невозможно выбрать объекты _thread.lock при использовании multiprocessing.Pool с оболочкой Logger на основе классов.

Сообщение Anonymous »

Я пытаюсь распараллелить задачу обработки данных, в которой я поместил свою логику в класс. Предполагается, что каждый экземпляр класса записывает свой прогресс в централизованный файл журнала. Однако как только я вызываюpool.map(), я получаю обратную трассировку, которую не совсем понимаю.
У меня есть класс DataProcessor, который содержит экземпляр средства регистрации. Я хочу создать несколько экземпляров этого класса и обрабатывать их параллельно с помощью multiprocessing.Pool.

Код: Выделить всё

import logging
import multiprocessing

class DataProcessor:
def __init__(self, name):
self.name = name
self.logger = logging.getLogger("ProcessorLogger")
self.logger.setLevel(logging.INFO)

def run(self, data):
self.logger.info(f"{self.name} is processing {data}")
return data * 2

def worker(obj_and_data):
obj, data = obj_and_data
return obj.run(data)

if __name__ == "__main__":
tasks = [(DataProcessor(f"Proc-{i}"), i) for i in range(5)]

with multiprocessing.Pool(processes=4) as pool:
# This line triggers the error
results = pool.map(worker, tasks)
print(results)
Когда я запускаю это, я получаю следующую обратную трассировку:

Код: Выделить всё

Traceback (most recent call last):
File "script.py", line 22, in 
results = pool.map(worker, tasks)
...
File "/usr/lib/python3.10/multiprocessing/reduction.py", line 51, in dump
ForkingPickler(file, protocol).dump(obj)
TypeError: cannot pickle '_thread.lock' object
AttributeError: Can't pickle _thread.lock objects
Что я пробовал
  • Я пытался сделать регистратор глобальной переменной, но мне нужны разные конфигурации для разных процессоров.
  • Я пробовал использовать pathos.multiprocessing, который использует dill, но у меня все равно возникают проблемы с сериализацией или журналы просто не отображаются.
Почему наличие self.logger препятствует отправке класса в пул и каков «правильный» способ обработки журналирования в классе, который необходимо выбрать для многопроцессорной обработки?

Вернуться в «Python»