2017-10-01 4 views
0

Ich bin mit all diesen asynchronen/Multithread-libs und native clojure Fähigkeiten verloren.zuweisen Thread pro Anfrage clojure

Ich habe einen Webservice, der eine externe API aufruft, die Antwort transformiert und dem Client zurückgibt. Gerade jetzt ist in Python geschrieben. Ich möchte jeden Client seine Anfrage in einem separaten Thread ausführen lassen, damit sie nicht aufeinander warten müssen, bis der Server beendet ist oder der Server asynchron ist. Es gibt keine schweren Berechnungen, nur auf IO wartend.

Ich dachte, das wäre mit clojure einfach, aber mir fehlt etwas ... Aleph ist async Server, oder? Wenn ich jedoch einen internen Request-Handler wait simuliere, wartet der gesamte Server, nicht nur der Client. Also sehe ich nicht den Sinn, hier asynchron zu sein?

In meinem Verständnis, was falsch sein kann, ist, dass ein asynchroner Server nie für IO-Operationen blockiert? Kann sleep ist ein schlechter Mittelwert für die Simulation warten auf IO?

EDIT habe ich einen stummen Warte Service, die ich von Clojure des Aleph-Server aufrufen, und nach wie vor ist die Anforderung Handhabung

(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})) 
) 

Antwort

3

sequenziellen Wenn ein asynchrones Backend Sie im Auge behalten müssen, Schreiben, die Sie benötigen Verwenden Sie keine Blockiermethodenaufrufe, da diese Ihre asynchronen Worker-Threads und damit Ihr gesamtes Backend blockieren.

Die Grundidee der asynchronen Programmierung besteht darin, dass Ihre Worker-Threads hauptsächlich CPU-Arbeit leisten und Callbacks (oder Kanäle oder Streams oder Verteiler, usw.) für jede andere potenziell blockierende Operation verwenden. Auf diese Weise kann die asynchrone Programmierung Ihrer Anwendung einen höheren Durchsatz bieten.

In Ihrem Beispiel blockiert (Thread/sleep .) einen Worker-Thread.

Bei Verwendung von Aleph für HTTP können Sie die manifold-Bibliothek für asynchrone IO verwenden.

Es gibt ein paar examples der Verwendung von Aleph mit Verteiler. Sie könnten beispielsweise core.async-Timeouts zum Simulieren einer lang andauernden Aufgabe verwenden, wie in this example zu sehen ist.