Итак, я только что просмотрел этот разговор в Python Global Interpreter Lock (GIL) http://blip.tv/file/2232410.
Суть его в том, что GIL - довольно хороший дизайн для одноядерных систем (Python существенно оставляет обработку потоков/планирование до операционной системы). Но это может серьезно отразиться на многоядерных системах, и в итоге вы столкнулись с интенсивными потоками ввода-вывода, которые сильно блокируются потоками с интенсивным использованием процессора, расходами на переключение контекста, проблемой ctrl-C [*] и т.д.
Итак, поскольку GIL ограничивает нас в основном выполнением Python-программы на одном процессоре, я думаю, почему бы не принять это и просто использовать набор задач в Linux, чтобы установить близость программы к определенному ядру/процессору в системе (особенно в ситуация с несколькими приложениями Python, работающими в многоядерной системе)?
Итак, в конечном итоге, мой вопрос: кто-нибудь попытался использовать набор задач в Linux с приложениями Python (особенно при запуске нескольких приложений в системе Linux, чтобы несколько ядер могли использоваться с одним или двумя приложениями Python, привязанными к определенному ядру) и если да, то каковы были результаты? стоит ли это делать? Ухудшается ли ситуация для определенных рабочих нагрузок? Я планирую сделать это и протестировать его (в основном, посмотреть, требуется ли программе больше или меньше времени для запуска), но хотелось бы услышать от других, что касается ваших впечатлений.
Дополнение: Дэвид Бэзли (парень, говорящий в связанном видео) указал, что некоторые расширения C/С++ вручную освобождают блокировку GIL и если эти расширения оптимизированы для многоядерных (например, научного или числового анализа данных /etc.), то вместо того, чтобы получать преимущества многоядерного ядра для хрустания номера, это будет эффективно искалечено тем, что оно ограничено одним ядром (что потенциально значительно замедляет вашу программу). С другой стороны, если вы не используете расширения, такие как
Причина, по которой я не использую модуль многопроцессорности, заключается в том, что (в данном случае) часть программы сильно связана с сетевым вводом-выводом (HTTP-запросы), поэтому наличие пула рабочих потоков - это БОЛЬШОЙ способ сжать производительность из ящик, поскольку поток запускает HTTP-запрос, а затем, поскольку он ожидает ввода-вывода, отказывается от GIL, а другой поток может это сделать, так что часть программы может легко запускать более 100 потоков, не причиняя большого вреда процессору и не позволяя я фактически использую имеющуюся пропускную способность сети. Что касается stackless Python/etc, я не слишком заинтересован в перезаписи программы или замене моего стека Python (наличие также будет проблемой).
[*] Только основной поток может принимать сигналы, поэтому, если вы отправляете ctrl-C, интерпретатор Python в основном пытается запустить основной поток, чтобы он мог обрабатывать сигнал, но поскольку он напрямую не контролирует, какой поток (это остается в операционной системе), он в основном сообщает ОС, что она продолжает переключать потоки, пока она не попадет в основной поток (что, если вам не повезло, может занять некоторое время).