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