Как исправить ошибку в multiprocessing’e?
Сначала я подумал что это из-за работы с файлами, пробовал убирать все связанное с чтением и записью файлов — не помогло
Сам код(работающие функции не выкладываю, там уйма строк, 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)
- Вопрос задан более трёх лет назад
- 1147 просмотров
Комментировать
Решения вопроса 1
vikholodov @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 не пробовал.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Django
Почему Django форма удаляет пробелы в clean_fieldname(), но сохраняет при вставке в БД?
- 1 подписчик
- час назад
- 18 просмотров
Python textiowrapper io что это
A Buffered text stream. This differs from py3k TextIOWrapper, which currently handles both text mode (py3k text mode is incompatible with Python 2.x’s text mode) as well as universal mode.
Field Summary
Fields inherited from class org.python.core.io.TextIOBase
Fields inherited from class org.python.core.io.IOBase
Constructor Summary
Contruct a TextIOWrapper wrapping the given BufferedIOBase.
Method Summary
| Modifier and Type | Method and Description |
|---|---|
| String | read(int size) |
Read and return up to size bytes, contained in a String.
Read until EOF.
Read until size, newline or EOF.
Write the given String to the IO stream.
Methods inherited from class org.python.core.io.TextIOBase
Methods inherited from class org.python.core.io.IOBase
Methods inherited from class java.lang.Object
Constructor Detail
TextIOWrapper
public TextIOWrapper(BufferedIOBase bufferedIO)
Contruct a TextIOWrapper wrapping the given BufferedIOBase.
Method Detail
read
public String read(int size)
Description copied from class: TextIOBase
Read and return up to size bytes, contained in a String. Returns an empty String on EOF
readall
public String readall()
Description copied from class: TextIOBase
Read until EOF.
readline
public String readline(int size)
Description copied from class: TextIOBase
Read until size, newline or EOF. Returns an empty string if EOF is hit immediately.
write
Description copied from class: TextIOBase
Write the given String to the IO stream. Returns the number of characters written.
Открытие и закрытие файлов — Python: Основы текстового ввода-вывода
В Python файл открывается с помощью функции open , которой нужно передать путь до файла и режим. С путём всё понятно. А режим нужен для того, чтобы указать то, как мы хотим использовать файл: будем ли мы записывать или читать, будем работать с текстом или же с бинарными данными, хотим ли мы очистить файл перед записью в него. Пока мы будем работать с файлами в самых простых режимах: чтение и запись текста.
Чтобы что-то прочитать из файла, надо бы его создать и что-то в него записать. С этого и начнём. Откроем файл на запись:
f = open('foo.txt', 'w') f #
Переменная f теперь ссылается на некий файловый объект. Пусть вас не пугает имя типа, пока вы можете обращать внимание только на параметры — name , mode и encoding . Имя и режим те, что мы указали при вызове open , а кодировка encoding выбрана умолчательная — UTF-8 (практически всегда именно она вам и будет нужна).
Итак, файл мы открыли. Закрывается он так:
… f.close() f.closed # True
closed здесь — атрибут объекта f . Атрибуты — это такие переменные внутри связанного объекта.
Автоматическое закрытие файла
Вы уже знаете, что Python — язык с автоматическим управлением памятью. Зная это, можно догадаться, что среда исполнения закрывает файл, когда удаляется последняя ссылка на файловый объект. Легко и просто!
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:
Python textiowrapper io что это
Чтобы открыть текстовый файл на запись, необходимо применить режим w (перезапись) или a (дозапись). Затем для записи применяется метод write(str) , в который передается записываемая строка. Стоит отметить, что записывается именно строка, поэтому, если нужно записать числа, данные других типов, то их предварительно нужно конвертировать в строку.
Запишем некоторую информацию в файл «hello.txt»:
with open("hello.txt", "w") as file: file.write("hello world")
Если мы откроем папку, в которой находится текущий скрипт Python, то увидем там файл hello.txt. Этот файл можно открыть в любом текстовом редакторе и при желании изменить.
Теперь дозапишем в этот файл еще одну строку:
with open("hello.txt", "a") as file: file.write("\ngood bye, world")
Дозапись выглядит как добавление строку к последнему символу в файле, поэтому, если необходимо сделать запись с новой строки, то можно использовать эскейп-последовательность «\n». В итоге файл hello.txt будет иметь следующее содержимое:
hello world good bye, world
Еще один способ записи в файл представляет стандартный метод print() , который применяется для вывода данных на консоль:
with open("hello.txt", "a") as hello_file: print("Hello, world", file=hello_file)
Для вывода данных в файл в метод print в качестве второго параметра передается название файла через параметр file. А первый параметр представляет записываемую в файл строку.
Чтение файла
Для чтения файла он открывается с режимом r (Read), и затем мы можем считать его содержимое различными методами:
- readline() : считывает одну строку из файла
- read() : считывает все содержимое файла в одну строку
- readlines() : считывает все строки файла в список
Например, считаем выше записанный файл построчно:
with open("hello.txt", "r") as file: for line in file: print(line, end="")
Несмотря на то, что мы явно не применяем метод readline() для чтения каждой строки, но в при переборе файла этот метод автоматически вызывается для получения каждой новой строки. Поэтому в цикле вручную нет смысла вызывать метод readline. И поскольку строки разделяются символом перевода строки «\n», то чтобы исключить излишнего переноса на другую строку в функцию print передается значение end=»» .
Теперь явным образом вызовем метод readline() для чтения отдельных строк:
with open("hello.txt", "r") as file: str1 = file.readline() print(str1, end="") str2 = file.readline() print(str2)
hello world good bye, world
Метод readline можно использовать для построчного считывания файла в цикле while:
with open("hello.txt", "r") as file: line = file.readline() while line: print(line, end="") line = file.readline()
Если файл небольшой, то его можно разом считать с помощью метода read() :
with open("hello.txt", "r") as file: content = file.read() print(content)
И также применим метод readlines() для считывания всего файла в список строк:
with open("hello.txt", "r") as file: contents = file.readlines() str1 = contents[0] str2 = contents[1] print(str1, end="") print(str2)
При чтении файла мы можем столкнуться с тем, что его кодировка не совпадает с ASCII. В этом случае мы явным образом можем указать кодировку с помощью параметра encoding :
filename = "hello.txt" with open(filename, encoding="utf8") as file: text = file.read()
Теперь напишем небольшой скрипт, в котором будет записывать введенный пользователем массив строк и считывать его обратно из файла на консоль:
# имя файла FILENAME = "messages.txt" # определяем пустой список messages = list() for i in range(4): message = input("Введите строку " + str(i+1) + ": ") messages.append(message + "\n") # запись списка в файл with open(FILENAME, "a") as file: for message in messages: file.write(message) # считываем сообщения из файла print("Считанные сообщения") with open(FILENAME, "r") as file: for message in file: print(message, end="")
Пример работы программы:
Введите строку 1: hello Введите строку 2: world peace Введите строку 3: great job Введите строку 4: Python Считанные сообщения hello world peace great job Python