Как использовать расширения C в Python, чтобы обойти GIL - PullRequest
11 голосов
/ 18 августа 2010

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

Ответы [ 5 ]

9 голосов
/ 18 августа 2010

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

Сделай это.

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

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

Без особого труда это часто может привести к резкому ускорению.

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

А.

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

7 голосов
/ 18 августа 2010

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

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

1 голос
/ 18 августа 2010

Это хорошее использование расширения C.Ключевое слово, которое вы должны искать: Py_BEGIN_ALLOW_THREADS.

http://docs.python.org/c-api/init.html#thread-state-and-the-global-interpreter-lock

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

0 голосов
/ 18 августа 2010

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

0 голосов
/ 18 августа 2010

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

...