Краткий ответ на ваш вопрос: нет , витая резьба не является правильным решением для тяжелой обработки.
Если у вас много обработки, то витая нить все равно будет зависеть от GIL (Global Interpreter Lock). Не вдаваясь в подробные объяснения, GIL - это то, что позволяет только одному потоку одновременно выполнять код Python. По сути это означает, что вы не сможете использовать преимущества нескольких ядер в одном многопоточном витом процессе. Тем не менее, некоторые C модули (например, биты SciPy) могут освобождать GIL и запускать многопоточность, хотя связанный с ним код Python по-прежнему эффективно однопоточен.
То, для чего витая нить в основном полезна, это использование ее вместе с блокировкой модулей на основе ввода / вывода. Главный пример этого - API базы данных, потому что спецификация db-api не учитывает асинхронные сценарии использования, и большинство модулей базы данных придерживаются этой спецификации. Таким образом, чтобы использовать PostgreSQL, например, из витого приложения, нужно либо заблокировать, либо использовать что-то вроде twisted.enterprise.adbapi
, являющееся оболочкой, которая использует twisted.internet.threads.deferToThread
, чтобы позволить выполнению SQL-запроса во время выполнения других задач. Это может позволить запустить другой код Python, потому что модуль socket
(среди большинства других, связанных с операциями ввода-вывода операционной системы) будет освобождать GIL во время системного вызова.
Тем не менее, вы можете использовать twisted для написания сетевого приложения, разговаривающего со многими скрученными (или не скрученными, если хотите) работниками. После этого каждый работник мог бы выполнять небольшую работу, и вы бы не ограничивались GIL, поскольку каждый работник был бы своим собственным полностью изолированным процессом. Главный процесс может затем использовать многие из асинхронных витых примитивов. Например, вы можете использовать DeferredList
, чтобы дождаться результатов, полученных от любого количества работников, а затем запустить обработчик ответа, когда все Deferred
будут завершены. (что позволяет вам выполнять вызов карты). Если вы хотите пойти по этому маршруту, я рекомендую посмотреть twisted.protocols.amp
, который является их протоколом асинхронных сообщений, и его можно очень просто использовать для реализации сетевого RPC или карты. уменьшить.
Недостатком запуска многих разнородных процессов по сравнению с чем-то вроде multiprocessing
является то, что
- вы теряете простое управление процессами, а
- подпроцессы не могут совместно использовать память, как если бы они были разветвлены в системе Unix.
Хотя для современных систем 2) редко является проблемой, если вы не запускаете сотни подпроцессов. И проблема 1) может быть решена с помощью системы управления процессами, такой как supervisord
Редактировать Чтобы больше узнать о Python и GIL, вам следует посмотреть доклады Дейва Бизли на эту тему ( веб-сайт , видео , слайды )