Как многопоточный веб-сервер влияет на программу Clojure?
Я знаю, что вы можете создать многопоточную программу Clojure явно, используя инструменты в java.util.concurrent.Executors
и языковые конструкции, такие как агенты и атомы. Однако, если я напишу приложение Ring, как многопоточный сервер (например, Jetty или Immutant) изменит способ его работы? Если я выполню некоторую инициализацию (например, загрузку конфигурации, настройку пула соединений с базой данных) до того, как начну обслуживать запросы, получу ли я дублированную, возможно, несовместимую работу в разных потоках? Будет ли каждый запрос обрабатываться одним потоком?
1 ответ
Ваш код Clojure будет бездействовать без какого-либо потока до тех пор, пока не поступит веб-запрос (по сути, вы пишете библиотеку / подпрограмму, а не основную программу). Jetty и др. Назначат поток для вызова вашего кода Clojure, предоставив соответствующие параметры. Если вы делаете какие-либо запросы к БД, они, как правило, отправляются через компьютер к БД, который назначит поток для обработки вашего запроса и выдаст соответствующие результаты. Ваш поток в Jetty получит данные из БД и продолжит обработку оттуда.
Важной частью является то, что каждый фрагмент информации рассматривается как неизменное сообщение. Сообщение может быть скопировано и передано из одной системы в другую без потери его значения. Неважно, сколько копий сделано и удалено, только одна копия попадает в конечный пункт назначения.
Простое веб-приложение, как правило, не требует какой-либо собственной многопоточности, так как обработка и синхронизация потоков, предоставляемые Jetty и БД, - это обычно все, что нужно. Если вы для чего-то делаете свою собственную многопоточность, вам в основном нужно беспокоиться о собственной внутренней синхронизации.
Вы можете увидеть некоторую полезную информацию в Интернете на The Clojure Cookbook.
Я также очень рекомендую книгу " Веб-разработка с Clojure".