а вы понимаете, как работает, к примеру, gunicorn?
для тех, кто не в курсе, я поясню. у вас есть сервер, который хочет:
1. иметь несколько воркеров, на один из которых и пойдёт обработка запроса, то есть работать не в один процесс, а в несколько (иначе будете испытывать преимущества только одного ядра).
2. с другой стороны, вы не хотите, чтоб воркеры простаивали на socket-запросах (типа запрос в БД или подобное), потому хотите, чтоб воркеры работали с сокетами через какой-нибудь eventlet (на время запроса засыпали и переключались на другой зелёный поток, если надо)
Но проблема в том, что предугадать задержки на сокетах у воркеров невозможно, и узнать их тоже некак. Потому, на сколько я понял, они действительно кормятся тупо все, но делается предположение, что, скажем, 10 запросов на один воркер ну уж точно ему хватит ("одновременно" обрабатывать, в зелёных потоках), а на остальное мы настроим, скажем, nginx, который будет держать их в очереди.
Почему nginx, а не, скажем, наш "главный" процесс? (который за воркерами следит) Вот тут у меня и возникает вопрос: как оно вообще распределяет запросы? Если я правильно понял — оно всем воркерам расшаривает одни и те же сокеты (через /tmp/somefile UNIX-сокет), и те все асинхронно из всех читают, но каким-то образом получается чтение только у одного из воркеров.
В общем, прошу объяснить мне вот этот трюк (если кто знает) с расшариванием сокетов. Спасибо.
kb
03.10.2011 10:38 c8541125
Recommended by:
@odin
Do you really want to delete ?
Там сплошной Round Robin, я уверен на 99%.
И да, сабж говно, ставь gevent.
почему говно? при чем тут gevent, если gunicorn умеет через gevent работать, а gevent не умеет, собственно, несколько процессов (что умеет gunicorn)?
умеет лол. man gevent.fork
уу, ок. а почему говно?
потому что тормоз. Были где-то тесты, поищи, даже твистеду всосал впроглот
я думал и твистед не умеет много процессов. но если ты так говоришь..
а вот твистед не умеет, увы
что-то не вижу документации о gevent.fork нифига. помоги, плиз? http://www.gevent.org/gevent.html
ну и, собственно, я еще померяю на PyPy скорость, мало ли, можт и gevent+cpython всосёт
> pypy
Ты всё ещё пытаешься это поделие использовать? Успокойся, он никогда не будет быстрее cpython.
у многих уже быстрее, почему бы и нет.
лол http://www.gevent.org/gevent.html#gevent...
http://pastebin.com/bgkUbqKf рабочий кусок тестового псача
*у многих составителей тестов для pypy
fixed
та не, та же quora ж переведена почти вся на pypy, говорят лучше сделали им (ну понятно, если Gaynor пилил), ну и еще были истории успеха
только тут нету многопроцессорности, у меня где-то в дебрях ~/src есть такой
подожди. так этот gevent.fork — это зелёный процесс или настоящий?
там фишка простая. Создаёшь StreamServer, а потом форкаешь
самый настоящий fork()
тю блин. ок, ну допустим. и что дальше? типа двое попытаются на одном порту запустить StreamServer или где?
нет. Сначала создаёшь StreamServer, а потом делаешь форки. Все поступающие запросы по round robin будут передаваться на процессы
то есть несколько процессов будут слушать один порт
понятно. ключевое слово — round robin :-)
а не проверял, это я от балды сказал. Потому что самое простое решение
ок, я почитаю, что это такое. но что — вернусь за вопросами