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