Мне нужно преобразовать несколько файлов .xlsx в файлы PDF. Я использую Linux mint и написал скрипт, который правильно выполняет работу, если обработка выполняется последовательно. Однако это занимает много времени, и я хотел бы ускорить процесс, работая одновременно. Идея состоит в том, чтобы разделить список файлов, которые необходимо преобразовать, пополам и делать это одновременно и независимо. Это должно работать, поскольку файлы независимы друг от друга.
Я пробовал использовать для этой цели asyncio и обратился за помощью к ChatGPT, но не могу решить проблему, потому что случайно около 10 файлов (количество варьируется) из 100
просто не конвертируются в PDF.
Мне нужна ваша помощь, чтобы понять, что происходит.
Использован оригинальный сценарий следующий подход, и он работает медленно, но правильно:
def convert_pdf_soffice(xlsx_file: str)->None:
out_dir = './PdfDir/'
print('Started conversion of ', xlsx_file)
subprocess.run(['soffice', '--headless', '--convert-to', 'pdf', '--outdir', out_dir, xlsx_file])
print('Finished conversion of ', xlsx_file)
Я вызывал функцию преобразования в цикле, вот так:
for file in xls_files_to_be_converted:
convert_pdf_soffice(file)
Параллельный подход заключается в следующем:
#!/usr/local/bin/python3
import os
import asyncio
import time
async def convert_pdf_soffice(xlsx_files):
out_dir = './PdfDir/'
tasks = []
for xlsx_file in xlsx_files:
print('Started conversion of ', xlsx_file)
process = await asyncio.create_subprocess_exec(
'soffice', '--headless', '--convert-to', 'pdf', '--outdir', out_dir, xlsx_file,
stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
)
tasks.append(process)
for task, xlsx_file in zip(tasks, xlsx_files):
stdout, stderr = await task.communicate()
if task.returncode != 0:
print(f'Conversion of {xlsx_file} failed with return code {task.returncode}')
else:
print('Finished conversion of ', xlsx_file)
async def main():
start_t = time.time()
INPUT_DIR = './XLSX/'
OUTPUT_DIR = './PdfDir/'
# Create folder if not exists
if not os.path.exists(OUTPUT_DIR):
os.makedirs(OUTPUT_DIR)
# List of all xlsx files
xlsx_file_list = [file for file in os.listdir(INPUT_DIR) if file.endswith('.xlsx')]
# Split the list into two halves
mid_index = len(xlsx_file_list) // 2
first_half = xlsx_file_list[:mid_index]
second_half = xlsx_file_list[mid_index:]
# List of xlsx files to be converted to pdf
first_half_paths = [os.path.join(INPUT_DIR, file) for file in first_half]
second_half_paths = [os.path.join(INPUT_DIR, file) for file in second_half]
# Run conversions concurrently for both halves
await asyncio.gather(
convert_pdf_soffice(first_half_paths),
convert_pdf_soffice(second_half_paths)
)
end_t = time.time()
duration_t = end_t - start_t
print(f'Duration is {duration_t}')
if __name__ == '__main__':
asyncio.run(main())
Подробнее здесь: https://stackoverflow.com/questions/786 ... -correctly
Правильное использование asyncio или многопроцессорности в Python ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Asyncio Async Funcitons вешает с Asyncio.gather. (Код работает без Asyncio.gather)
Anonymous » » в форуме Python - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Использование многопроцессорности для параллельных прогнозов в PyTorch
Anonymous » » в форуме Python - 0 Ответы
- 43 Просмотры
-
Последнее сообщение Anonymous
-