2017-10-01 11 views
0

이 비동기/다중 스레드 라이브러리 및 원시 클로저 기능이 모두 손실됩니다.요청마다 스레드를 할당하십시오.

외부 API를 호출하고 응답을 변환 한 다음 클라이언트에게 돌려주는 webservice가 있습니다. 지금은 파이썬으로 작성되었습니다. 각 클라이언트가 별도의 스레드에서 요청을 실행하여 서로 마칠 때까지 또는 서버가 비동기가 될 때까지 기다리지 않도록하고 싶습니다. 과도한 계산이 필요하지 않으며 IO 만 기다립니다.

나는 clojure로 쉽게 될 것이라고 생각했지만 뭔가를 놓치고 있습니다 ... Aleph는 비동기 서버입니다, 맞습니까? 그러나 요청 처리기 내부에서 wait을 시뮬레이트하면 클라이언트뿐만 아니라 전체 서버가 대기합니다. 그래서 여기에 비동기 적 관점이 보이지 않습니까?

내가 잘못 이해 한 것은 비동기 서버가 IO 작업을 차단하지 않는다는 것입니다. sleep은 입출력을 기다리는 시뮬레이션에 나쁜 의미가 있습니까?

편집은 내가 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 시간 초과를 사용할 수 있습니다.