Правильное использование asyncio или многопроцессорности в PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Правильное использование asyncio или многопроцессорности в Python

Сообщение Anonymous »

Мне нужно преобразовать несколько файлов .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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»