@vikholodov

Как исправить ошибку в multiprocessing'e?

Есть 4 функции, 2 работающие, 1 объединяющая и 1 обязательная для Django (она у меня вроде как main)
Если запустить все без мультипроцессинга, то все работает как надо, с ним выдает ошибку:
TypeError: cannot serialize '_io.TextIOWrapper' object

Сначала я подумал что это из-за работы с файлами, пробовал убирать все связанное с чтением и записью файлов - не помогло
Сам код(работающие функции не выкладываю, там уйма строк, 1 подключается к внешнему api и выдергивает данные, вторая обрабатывает их и добавляет в бд ):
def make_all(self, cat):
        products = self.connect(cat)
        self.get_items(products)
        with open('cat_complete.txt', 'a') as file:
            file.write(str(cat)+'\n')
            file.close()

    def handle(self, *args, **options):
        cat_list = []
        cats = Category.objects.all().exclude(catId=0).distinct()
        for i in cats:
            cat_list.append(str(i.catId))
        with Pool(5) as p:
            p.map(self.make_all, cat_list)
  • Вопрос задан
  • 1193 просмотра
Решения вопроса 1
@vikholodov Автор вопроса
Решение оказалось таким, всем спасибо за советы:
from multiprocessing.dummy import Pool as ThreadPool
        pool = ThreadPool(4)
        pool.map(self.make_all, cat_list)
        pool.close()
        pool.join()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Sovetnikov
технический директор pulsprodaj.ru
1. Ставьте брейкпойнт в "c:\users\vik\appdata\local\programs\python\python36-32\Lib\multiprocessing\reduction.py", line 51, in dumps и ждите когда там появится TextIOWrapper и увидите суть проблемы
2. Суть проблемы в том, что multiprocessing не может что-то сериализовать для передачи в другой процесс, мне кажется вы сильно сократили ваш принципиальный код и проблема где-то в передаваемых данных между процессами.
3. Удостоверьтесь, что map может принимать в качестве func метод объекта ... в Python2 это не работало, в Python3 не пробовал.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы