2010-11-10 6 views
9

Я пишу сейчас, записывая некоторый код события (в python using gevent), и я использую nginx как веб-сервер, и я чувствую, что оба они великолепны. Мне сказали, что есть компромисс с событиями, но он не смог его увидеть. Может кто-то пролить свет?Почему я не должен использовать async (evented) IO

Джеймс

+0

Почему * не должен * вы? (Вы не указали никаких аргументов за или против.) – 2010-11-10 02:21:25

+0

Я хочу знать, что такое компромисс ... – James

+0

Когерентность кэширования? сложность кода? обработка потоков? –

ответ

1

Самая большая проблема в том, что без резьбы, блок для одного клиента будет вызвать блокировку для всех клиентов. Например, если один клиент запрашивает ресурс (файл на диске, выгружаемую память и т. Д.), Который требует, чтобы ОС блокировала процесс запроса, все клиенты должны будут ждать. Многопоточный сервер может блокировать только один клиент и продолжать обслуживать других.

Сказанное, если приведенный выше сценарий маловероятен (то есть все клиенты будут запрашивать одни и те же ресурсы), тогда управляемый событиями способ пойти.

+7

Что вы не упомянули, так это то, что вы можете просто получить доступ к ресурсу, который вам нужен неблокирующим способом. Таким образом, вы не блокируете, можете отвечать на запросы клиентов и получать обратный вызов из вашей системы событий, когда ресурс готов, все в одном потоке. – nosklo

+1

второй - идея кода на основе событий - использовать асинхронные интерфейсы для всего: отсутствие синхронного ввода-вывода. хотя с python даже с gevent, скрученными и т. д. довольно легко случайно использовать какой-то блокирующий вызов, если вы не будете осторожны. Кстати, это страница, которую все цитируют, когда говорят о потоках против событий: http://www.kegel.com/c10k.html – cce

+2

@cce: если c10k недостаточно, мы можем попробовать c500k: http: //blog.urbanairship .com/блог/2010/09/29/Linux-ядра, настройка-для-c500k / – jfs

9

Единственная сложность программируемого события заключается в том, что вы не должны блокироваться. Этого трудно достичь, если вы используете некоторые библиотеки, которые были разработаны с учетом потоков. Если вы не контролируете эти библиотеки, это значит, что fork() + message ipc - это путь.

 Смежные вопросы

  • Нет связанных вопросов^_^