У меня есть код, который генерирует тысячи счетов-фактур в виде PDF-файлов, а затем записывает их в zip-файл и затем выкачивает их поверх HttpStreamingResponse (django). Генерация PDF действительно медленная и в настоящее время однопоточная.Работа с многопоточным выходом последовательно
Я могу быстро сгенерировать исходный HTML для PDF-файлов. Я хотел бы:
- Сформировать все HTML (однопоточный, база данных не может обрабатывать одновременно Lookups)
- Преобразовать эти в PDF-файлы, в 8 потоков
- Синхронно обрабатывать выход из PDF-файлов поэтому я могу добавить его в файл zipstream.
Я занимался многопроцессорной обработкой.Надеюсь, но я не знаю, как это сделать должным образом. Вот приблизительный код.
def generate_statements(request):
htmls = [generate_html(customer) for customer in customers]
pdfs = [generate_pdf(html) for html in htmls]
# create zip file
for pdf in pdfs:
zip.writestring(...)
# output this to browser
def generate_html(customer):
# do something that returns a string of HTML
def generate_pdf(html):
# do something that creates a single pdf
Если есть возможность, чтобы начать преобразование HTML перед HTMLs закончены, еще лучше, но мне нужно обрабатывать вывод generate_pdf
линейным способом; Я не могу писать в zip одновременно.
(PS: Я понимаю, что некоторые из этих вещей может показаться, как домашнее задание, но, пожалуйста, посмотрите на мой профиль сети, прежде чем предположить, что я ленивый студент ... Я ленивый профессиональный программист thankyouverymuch)
Я бы с [резьб] (https://docs.python.org/dev/library/threading.html) и [очередей] (https://docs.python.org /dev/library/queue.html). Я полагаю, что фактическая работа по созданию PDF-файлов выполняется с помощью внешней программы; Если это так, я бы избегал многопроцессорной обработки (https://docs.python.org/dev/library/multiprocessing.html), поскольку он добавляет лишние накладные расходы. –
«база данных не может обрабатывать параллельные запросы» - получение лучшей базы данных может быть хорошим началом ... – twalberg