Я хочу запустить программу с интенсивным использованием процессора на Python для нескольких ядер и пытаюсь выяснить, как написать расширения C для этого. Есть ли какие-либо примеры кода или учебные пособия по этому вопросу?
Взгляните на многопроцессорность . Часто упускают из виду тот факт, что операционные системы предпочитают не обмениваться данными глобально и не втискивать множество потоков в один процесс.
Если вы по-прежнему настаиваете на том, что интенсивное использование вашего процессора требует многопоточности, взгляните на документацию по , работающему с GIL на C . Это довольно информативно.
Рассматривали ли вы использование одной из библиотек python mpi, например mpi4py ? Хотя MPI обычно используется для распределения работы по кластеру, он довольно хорошо работает на одной многоядерной машине. Обратной стороной является то, что вам придется реорганизовать свой код, чтобы использовать вызовы связи MPI (что может быть несложно).
многопроцессорность - это просто. если этого недостаточно, ваш вопрос сложный.
Это хорошее использование расширения C. Ключевое слово, которое вы должны искать - Py_BEGIN_ALLOW_THREADS
.
http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock
P.S. Я имею в виду, если ваша обработка уже на C, например, обработка изображений, то освобождение блокировки в расширении C - это хорошо. Если ваш код обработки в основном на Python, то лучше воспользоваться предложением других людей multiprocessing
. Переписывать код на C для фоновой обработки обычно не оправдано.
Вы уже можете разбить программу на Python на несколько процессов. ОС уже распределит ваши процессы по всем ядрам.
Сделайте это.
python part1.py | python part2.py | python part3.py | ... etc.
ОС позаботится о том, чтобы часть использовала как можно больше ресурсов. Вы можете тривиально передавать информацию по этому конвейеру, используя cPickle
на sys.stdin
и sys.stdout
.
Без особых усилий это часто может привести к значительному ускорению.
Да - для ненавистников - можно построить настолько мучительный алгоритм, что он не сможет сильно ускориться. Однако это часто дает огромные преимущества при минимальной работе.
И.
Реструктуризация для этой цели будет точно соответствовать реструктуризации, необходимой для максимизации параллелизма потоков. Итак. Начните с параллелизма процессов, не требующего совместного использования, пока не докажете, что совместное использование большего количества данных поможет, затем переходите к более сложному параллелизму потоков, требующему совместного использования всего.