Выделить поток для каждого запроса clojure

Я потерян со всеми этими асинхронными / многопоточными библиотеками и возможностями родного замыкания.

У меня есть веб-сервис, который вызывает внешний API, преобразовывает его ответ и возвращает клиенту. Прямо сейчас написано на Python. Я хотел бы позволить каждому клиенту выполнять свой запрос в отдельном потоке, чтобы они не ожидали завершения друг друга или асинхронного сервера. Здесь нет сложных вычислений, только ожидание ввода-вывода.

Я думал, что это будет легко с clojure, но я что-то упустил... Алеф является асинхронным сервером, верно? Тем не менее, когда я моделирую wait Внутри обработчика запросов ждет весь сервер, а не только клиент. Так что я не вижу смысла быть здесь асинхронным?

Насколько я понимаю, что может быть неправильно, асинхронный сервер никогда не блокируется для операций ввода-вывода? Может быть sleep это плохое средство для имитации ожидания ввода-вывода?

РЕДАКТИРОВАТЬ Я создал тупой сервис ожидания, который я вызываю с сервера Alej Clojure, и тем не менее, обработка запросов является последовательной

(ns aleph-t.core
 ( :require [aleph.http :as http]
            [aleph.netty :as netty]))

(defn heavy [] (Thread/sleep 10000) "hello!")

(defn handler [req]
  {:status 200
   :headers {"content-type" "text/plain"}
   :body (heavy)})
; need to wait otherwise server is closed
(defn -main [& args]
  (netty/wait-for-close (http/start-server handler {:port 8080}))
  )

1 ответ

При написании асинхронного бэкэнда вы должны помнить, что вы не должны использовать блокирующие вызовы методов, потому что они будут блокировать ваши асинхронные рабочие потоки и, следовательно, весь ваш бэкэнд.

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

В вашем примере (Thread/sleep .) блокирует рабочий поток.

При использовании aleph для HTTP вы можете использовать библиотеку манифольдов для асинхронного ввода-вывода.

Есть несколько примеров использования aleph с манифольдом. Например, вы можете использовать время ожидания core.async для имитации длительной задачи, как показано в этом примере.

Другие вопросы по тегам