Как использовать расширения C в python для обхода GIL

Я хочу запустить программу с интенсивным использованием процессора на Python для нескольких ядер и пытаюсь выяснить, как написать расширения C для этого. Есть ли какие-либо примеры кода или учебные пособия по этому вопросу?

11
задан ShahQermez 18 August 2010 в 16:46
поделиться

5 ответов

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

Если вы по-прежнему настаиваете на том, что интенсивное использование вашего процессора требует многопоточности, взгляните на документацию по , работающему с GIL на C . Это довольно информативно.

7
ответ дан 3 December 2019 в 08:28
поделиться

Рассматривали ли вы использование одной из библиотек python mpi, например mpi4py ? Хотя MPI обычно используется для распределения работы по кластеру, он довольно хорошо работает на одной многоядерной машине. Обратной стороной является то, что вам придется реорганизовать свой код, чтобы использовать вызовы связи MPI (что может быть несложно).

-1
ответ дан 3 December 2019 в 08:28
поделиться

многопроцессорность - это просто. если этого недостаточно, ваш вопрос сложный.

-2
ответ дан 3 December 2019 в 08:28
поделиться

Это хорошее использование расширения 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 для фоновой обработки обычно не оправдано.

1
ответ дан 3 December 2019 в 08:28
поделиться

Вы уже можете разбить программу на Python на несколько процессов. ОС уже распределит ваши процессы по всем ядрам.

Сделайте это.

python part1.py | python part2.py | python part3.py | ... etc.

ОС позаботится о том, чтобы часть использовала как можно больше ресурсов. Вы можете тривиально передавать информацию по этому конвейеру, используя cPickle на sys.stdin и sys.stdout.

Без особых усилий это часто может привести к значительному ускорению.

Да - для ненавистников - можно построить настолько мучительный алгоритм, что он не сможет сильно ускориться. Однако это часто дает огромные преимущества при минимальной работе.

И.

Реструктуризация для этой цели будет точно соответствовать реструктуризации, необходимой для максимизации параллелизма потоков. Итак. Начните с параллелизма процессов, не требующего совместного использования, пока не докажете, что совместное использование большего количества данных поможет, затем переходите к более сложному параллелизму потоков, требующему совместного использования всего.

9
ответ дан 3 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

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