многопроцессорность.Пул: экземпляры класса и ошибка выбора

#python #python-2.7 #python-multiprocessing

#python #python-2.7 #python-многопроцессорность

Вопрос:

Я пытаюсь запустить некоторый скрипт на 10 подключенных платах (ограничение параллельного процесса 4 для стабильности). Я обнаружил следующую ошибку, и вот фрагмент кода. Я считаю, что это связано с экземпляром класса, но каждый объект класса независим, и ни один из ресурсов не является общим (и не возвращается)

 TypeError: can't pickle thread.lock objects
  

Код:

 def update_device_worker(worker):
    worker.run()

class Worker :
    def __init__(self, device):
        self.device = device

    def run(self):
       << bash code to run on IoT devices to cleanup and restart>>

pool = multiprocessing.Pool(processes=4, maxtasksperchild=1)
workers = [Worker(d) for d in connected_IoT_Devices]
pool.map(update_device_worker, workers)

class Device(object):
    def __init__(self, device):
        self.device = device
        self.ipaddress,  self.serial, self.model, self.log, 
            = None, None, None, None
        self.log = os.path.join(logPath,self.serial  ".log")
        custom_logger(self.log)
        self.logger = logging.getLogger(self.log)
        self.logger.info("Logger started for %s ", self.serial)
  

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

1. Похоже, что одно из устройств connected_IoT_Devices содержит Lock объект (похоже, вы пытаетесь поделиться им). Поскольку вы не показали определение «устройств», в лучшем случае трудно предложить обходной путь.

2. @martineau : обновлено

3.Ваше обновление по-прежнему не показывает, что такое device передаваемый Device класс’ __init__() . Я также подозреваю, что у вас возникнет аналогичная проблема с logger атрибутом экземпляра. В принципе, вы можете передавать другим процессам только те объекты, которые могут быть обработаны. Иногда вы можете преодолеть это ограничение с помощью multiprocessing Manager s. Подробности см. в multiprocessing документации.