Twisted Threading + MapReduce на одном узле / сервере? - PullRequest
2 голосов
/ 15 февраля 2011

Я не совсем понимаю, что такое Twisted Threading.

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

Однако из того, что я видел до сих пор, похоже, что Twisted использует Threads (pThreads из модуля потоков python).И Twisted, кажется, действительно очень хорошо справляется с обработкой большого количества данных.

У меня достаточно большое количество процессов, которые я хотел бы распределить, используя шаблон MapReduce в Python на одном узлесервер.Они на самом деле не делают IO, они просто много обрабатывают.

Является ли Twisted реактор подходящим инструментом для этой работы?

Ответы [ 2 ]

6 голосов
/ 15 февраля 2011

Краткий ответ на ваш вопрос: нет , витая резьба не является правильным решением для тяжелой обработки.

Если у вас много обработки, то витая нить все равно будет зависеть от 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 является то, что

  1. вы теряете простое управление процессами, а
  2. подпроцессы не могут совместно использовать память, как если бы они были разветвлены в системе Unix.

Хотя для современных систем 2) редко является проблемой, если вы не запускаете сотни подпроцессов. И проблема 1) может быть решена с помощью системы управления процессами, такой как supervisord


Редактировать Чтобы больше узнать о Python и GIL, вам следует посмотреть доклады Дейва Бизли на эту тему ( веб-сайт , видео , слайды )

0 голосов
/ 04 марта 2011

Вы также можете сделать многопроцессорную работу с Python 2.6 и выше http://docs.python.org/library/multiprocessing.html

Вот хороший пример использования многопроцессорной обработки с витой. Скрученный сетевой клиент с многопроцессорными рабочими?

...