Сравнение торнадо/витая - сельдерей - Gevent
У меня возникли проблемы с пониманием различий между этими тремя структурами:
Эти три фреймворка могут использоваться для одновременного запуска кода, но делать это по-разному, используя различное количество потоков/процессов или codestyle. Вот как я сейчас понимаю различия:
- Tornado/Twisted использует асинхронный код, управляемый контуром ввода-вывода. Это позволяет запускать код в одном потоке (несколько потоков бесполезны, потому что если у вас есть неблокирующий код, это необязательно)
- Celery использует систему на основе задач для асинхронного запуска кода, сам по себе код по-прежнему является синхронным. Существует основной процесс, который способен распределять различные задачи между другими работниками в разных процессах.
- Gevent использует систему на основе потоков и порождает поток для обработки различных подключений.
Вопросы, которые у меня есть сейчас:
- Правильно ли я понимаю эти рамки?
- Основное различие между потоком и процессом заключается в том, что разные потоки используют одну и ту же память, а процессы - нет. Является ли один процесс обычно выполняемым на одном сервере? (И, таким образом, Celery трудно реализовать на небольшом сервере)
- Если мы говорим о веб-приложениях и сокетах:
Tornado/Twisted Могут принимать (почти) любое количество сокетов, потому что они используют асинхронный код и ставят очередь запроса в цикле ввода/вывода.
Являются ли Celery/Gevent способными к этому? Нужно ли им создавать новый процесс/поток, чтобы иметь возможность принимать новый сокет?
Я пытаюсь выяснить, какая из этих технологий лучше всего подходит для создания веб-приложения в режиме реального времени.
Ответы
Ответ 1
-
Gevent использует greenlets вместо потоков в замкнутой схеме ввода-вывода, поэтому нет цикла реактора/ввода-вывода для запуска вручную в случай Twtisted/Tornado. У этого также есть способность к обезьянному патчу существующих библиотек для поддержки его событийной операции, Tornado и Twisted требуют, чтобы определенные библиотеки работали со своими циклами событий, хотя вы найдете, что многие уже существуют.
Сельдерей сделан гораздо больше для фоновой обработки, чтобы выгрузить дорогостоящие вычисления другому процессу/серверу.
-
Процессы могут совместно использовать память, но не так, как это делают потоки. Темы в CPython страдают от GIL и, как правило, не стоит использовать многопоточное решение, если вы делаете что-то интенсивное CPU.
Я не уверен в требованиях к памяти Celery, но если вы используете 1 веб-процесс и 1 фоновый процесс, вы должны быть в порядке даже на 256 Мб VPS, хотя лучше, если вы поддерживаете многие подключения.
/li > -
Количество сокетов, которые могут обрабатываться с помощью Tornado/Twisted/Gevent, скорее всего, будет ограничено количеством и частотой ввода-вывода для каждого сокета. Сокеты с низкой частотой/низкой пропускной способностью намного проще поддерживать большое количество параллельных подключений, поскольку они будут в основном бездействовать.
Сельдерей все равно потребует некоторого приложения для прослушивания сокетов и обработки вызовов с помощью демона Celery. Он также поддерживает Gevent, поэтому при необходимости вы можете выполнять несколько задач.