поточная обработка Python и производительность?

Я должен был сделать, тяжелый I/o связал операцию, т.е. Парсинг больших файлов и преобразование от одного формата до другого формата. Первоначально я раньше делал это последовательно, т.е. анализирующий один за другим..! Производительность была очень плоха (она использовала, берут 90 + секунды). Таким образом, я решил использовать поточную обработку для улучшения производительности. Я создал один поток для каждого файла. (4 потока)

 for file in file_list:
            t=threading.Thread(target = self.convertfile,args = file)
            t.start()
            ts.append(t)
 for t in ts:
            t.join()

Но для моего удивления, вообще нет никакого повышения производительности. Теперь также это берет приблизительно 90 + секунды для выполнения задачи. Поскольку это - связанная операция I/o, я ожидал улучшать производительность.

5
задан Cœur 19 August 2017 в 05:00
поделиться

2 ответа

Под обычным интерпретатором Python , многопоточность не будет выделять больше ядер ЦП для вашей программы из-за глобальной блокировки интерпретатора (также известной как GIL).

Модуль многопроцессорности может вам здесь помочь. (Обратите внимание, что это было введено в Python 2.6, но есть резервные копии для Python 2.5.)

Как говорит MSalters, если ваша программа связана с вводом-выводом, остается спорным, полезно ли это. Но, возможно, стоит попробовать :)

Чтобы добиться желаемого с помощью этого модуля:

import multiprocessing

MAX_PARALLEL_TASKS = 8 # I have an Intel Core i7 :)

pool = multiprocessing.Pool(MAX_PARALLEL_TASKS)

pool.map_async(convertfile, filelist)

pool.close()
pool.join()

Важно! Функция, которую вы передаете в map_async , должна иметь возможность выбора. В общем, методы экземпляра НЕ подходят для маринования, если вы не разработали их для этого! Обратите внимание, что convertfile выше является функцией.

Если вам действительно нужно получить результаты из файла преобразования , есть способы сделать это. Примеры на странице документации по многопроцессорной обработке должны прояснить ситуацию.

10
ответ дан 18 December 2019 в 16:36
поделиться

Многопоточность позволяет ОС выделять больше ядер ЦП для вашей программы. Если это ограничение ввода-вывода, это означает, что скорость была ограничена скоростью подсистемы ввода-вывода, а не скоростью процессора. В таких случаях выделение большего количества ядер ЦП не обязательно помогает - вы все еще ждете подсистему ввода-вывода.

2
ответ дан 18 December 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: