#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
документации.