@newPsevdonim
Python разработчик

Почему возникает ошибка cannot pickle '_thread.lock' object?

У меня есть класс и в нем мне нужно вычислить некоторые метрики, так как их очень много я попытался добавить несколько потоков используя multiprocessing. Но я получаю ошибку:
cannot pickle '_thread.lock' object

наткнулся на решение данной проблемы вынесом функции из класса. Я так и поступил, но получаю такую же ошибку. В чем может быть проблема.

Вот мой код:
class StartGetData:
    def start(self):
        tags = self.tags
        while True:
            parametrs = []

            for tag in self.tags:
                if (tag[0] in self.dict_last_time) and (self.dict_last_time[tag[0]] is not None):
                    parametr = {
                            "client": self.client,
                            "tag": tag[0],
                            "database_name": self.database_name,
                            "table_name": self.table_name,
                            "table": self.table_fields,
                            "last_time": self.dict_last_time[tag[0]]
                    }
                else:
                    parametr = {
                            "client": self.client,
                            "tag": tag[0],
                            "database_name": self.database_name,
                            "table_name": self.table_name,
                            "table": self.table_fields,
                            "last_time": None
                    }
                parametrs.append(parametr)

            pool = multiprocessing.Pool(1)
            resalt = pool.map(run_function, parametrs)
            
            pool.close()
            pool.join()


В функции, которая вызывается создаются ссылки на несколько других сингалтон классов (Возможно это важно)
  • Вопрос задан
  • 2560 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
pickle используется для проброса данных между процессами, и оно умеет сериализовывать только примитивы и простые коллекции. Какое-то из передаваемых тобой значений в parameters не подпадает под это определение.
Я подозреваю что это self.client, но это уже тебе надо проверять.
Ещё раз: в другой процесс можно передавать числа, строки, логические значения, кортежи, списки, словари. Всё остальное - без гарантий.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы