2017-10-01 13 views
0

この非同期/マルチスレッドのライブラリとネイティブクロージャの機能はすべて失われています。リクエストごとにスレッドを割り当てます。

私は外部APIを呼び出し、レスポンスを変換してクライアントに返すWebサービスを持っています。今はPythonで書かれています。私は、それぞれのクライアントが別のスレッドで要求を実行するようにして、お互いが終了するのを待たずに、あるいはサーバーが非同期になるようにしたいと思います。重い計算は必要ありませんが、IOを待つだけです。

私はこれがclojureで簡単だと思っていましたが、何かが欠けています... Alephは非同期サーバーですか?しかし、私がwaitリクエストハンドラをシミュレートすると、クライアントだけでなく、サーバ全体が待機しています。だから私はここでは非同期であるということをよく見ていないのですか?

私の理解では、間違っているかもしれませんが、非同期サーバーがIO操作をブロックすることはありませんか? sleepはIOを待っていることをシミュレートするための悪い意味ですか?

EDIT私は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})) 
) 

答えて

3

シーケンシャルでありますそれらは非同期ワーカースレッド、したがってあなたのバックエンド全体をブロックするので、ブロッキングメソッド呼び出しを使用しないでください。

非同期プログラミングの基本的な考え方は、ワーカースレッドが主に実際のCPUの作業を行い、その他の潜在的なブロッキング操作ごとにコールバック(またはチャネルまたはストリームまたはマニフェストなど)を使用することです。このように非同期プログラミングを行うことで、アプリケーションのスループットを向上させることができます。

例では、(Thread/sleep .)はワーカースレッドをブロックします。

HTTP用にalephを使用する場合は、manifoldライブラリを非同期IOに使用できます。

examplesには、マニホールド付きのアレフを使用したものがいくつかあります。 例えば、this exampleに示すように、長時間実行されるタスクをシミュレートするためにcore.asyncタイムアウトを使用できます。

関連する問題