2014-03-04 3 views
1

이것은 내 코드 조각입니다. 오류가 발생하지 않고 많은 고객에게 서비스를 제공 할 수 있는지 묻습니다 (프로세스가 2으로 제한 되었기 때문에).Flask의 ThreadPool

from multiprocessing.pool import ThreadPool 

pool = ThreadPool(processes=2) 

@app.route("/query/<lng>/<lat>/", methods=['GET', 'POST']) 
def query(lng,lat): 
    t1 = pool.apply_async(queryA, (lng, lat)) 
    t2 = pool.apply_async(queryB, (lng, lat)) 

    results = {} 
    results['a'] = t1.get() 
    results['b'] = t2.get() 

    return dumps(results) 

나는 이전에 함수 내부의 pool = ThreadPool(processes=2)했다하지만 난 error: can't start new thread 가지고 :

따라서
def query(lng,lat): 
    pool = ThreadPool(processes=2) 
    #rest 

내가 오류없이 동시에 1 개 이상의 고객 서비스를 제공 할 수 있는지 묻고 싶다을? 올바른 코드가 없다면 사용해야합니까?

pool은 현재 전역이며 2 개의 동시 요청이있는 경우 제한을 초과합니다 (2x2 = 4 개의 실행 요청).

+0

플라스크 개발 서버는 실제 사용을위한 것이 아닙니다. 여러 클라이언트를 제공해야하는 경우 플라스크 응용 프로그램을 웹 서버 뒤에 두십시오. 아파치, nginx, gunicorn .. 선택의 여지가 많습니다. – msvalkon

+0

@msvalkon gunicorn으로 실행하십시오 – Diolor

+0

그러면 해결하려는 문제는 정확히 무엇입니까? – msvalkon

답변

0

귀하의 의견대로, 귀하는 데이터베이스 연결에서 Flask webapp을 레이어로 사용하고 있습니다.

해당 설정으로 비동기 데이터베이스 쿼리를 쉽게 수행 할 수는 없지만 문제를 클라이언트로 옮길 수는 있습니다. 클라이언트가 비동기 적으로 여러 http 쿼리를 실행할 수 있습니까? 그렇다면 2 개의 별개의 라우트 기능에서 조회 기능을 분리하고 클라이언트에서 데이터를 집계 할 수 있습니다. 이 방법을 사용하면 두 쿼리를 모두 조정하고 gunicorn에서 동시성을 관리 할 수 ​​있습니다.

또 다른 접근법은 Flask 대신 Tornado와 같은 이벤트 기반 비동기 웹 프레임 워크를 사용하는 것입니다 (또는 일부 URL에만 해당).