Операции ввода-вывода, такие как сохранение файлов, всегда выполняются относительно медленно. Если вам придется обрабатывать большой пакет файлов, вы будете зависать с длительным временем ввода-вывода независимо от количества используемых потоков.
Самое простое - использовать многопоточность, а не многопроцессорность, и позволить планировщику ОС разобраться со всем этим. Документы имеют хорошее объяснение того, как настроить потоки. Простым примером будет
from threading import Thread
def process_data(file_name):
# does the processing
print(f'processed {file_name}')
if __name__ == '__main__':
file_names = ['file_1', 'file_2']
processes = [Thread(target=process_data, args=(file_name,)) for file_name in file_names]
# here you start all the processes
for proc in processes:
proc.start()
# here you wait for all processes to finish
for proc in processes:
proc.join()
Одним из решений, которое может быть быстрее, является создание отдельного процесса, который выполняет ввод / вывод. Затем вы используете multiprocessing.Queue
, чтобы поставить в очередь файлы из «потока обработки данных», и позволить потоку ввода-вывода подобрать их и обработать их один за другим.
Таким образом, ввод-вывод никогда не должен отдыхать, что будет близко к оптимальному. Я не знаю, даст ли это большое преимущество по сравнению с решением, основанным на многопоточности, но, как это обычно бывает с параллелизмом, лучший способ выяснить это - выполнить некоторые тесты с вашим собственным приложением.
Одной из проблем, о которых следует помнить, является то, что если обработка данных выполняется намного быстрее, то Queue
может вырасти очень большим. Это может повлиять на производительность, в зависимости от вашей системы, среди прочего. Быстрый обходной путь - приостановить обработку данных, если очередь становится слишком большой.
Не забудьте написать весь многопроцессорный код на Python в сценарии с
if __name__ == '__main__':
# mp code
сторожите и помните, что некоторые IDE не очень хорошо работают с параллельным кодом Python. Безопасная ставка - проверить ваш код, выполнив его из терминала.