2013-08-14 2 views
0

나는 http://bottlepy.org/docs/dev/tutorial_app.html#server-setup실행 gevent는

running Apache + Bottle + Python

Bottle + Apache + WSGI + Sessions

을 읽고 mod_wsgi에 서버에 병 호출 나는 하나의 비동기 나머지 API를 실행할 수 있는지 알고 싶습니다 아무것도 반환하지 않는 py 함수 (백엔드 로직)와 블로킹이 아닙니다. 그래서 gevent를 찾았지만 gevent와 함께 mod_wsgi를 실행할 수있는 해결책을 찾지 못했습니다.

mod_wsgi 또는 다른 대안을 사용하여 아파치 서버에서 실행하는 비동기 호출에 대한 해결책이 있습니까?

업데이트 아래의 andreans '답변과 같이;

나는 bottle + celery로 간단한 myip address return을 실행했다. 그래서 셀러리를 @ celery.task로 실행 한 다음 (host = 'localhost', port = 8080, debug = True) 실행해야합니까? 셀러리 작업자도 터미널에서 시작해야합니까? [runnin]을하기 전에 셀로리를 사용하지 마십시오. @route (/ something)와 함께 병을 돌리지 만 app.route는 app = Bottle()이 될 수 있습니다.

+0

당신은 셀러리를 사용하여 작업을 정의하고 요청 처리기 기능에서 비동기 적으로 실행할 수 있으므로 차단하지 않으므로 처리기 func이 즉시 반환하지만 클라이언트 응용 프로그램은 주기적으로 결과를 확인해야합니다. 유효한. – andrean

+0

@andrean 만약 내가 그냥 클라이언트 응용 프로그램에서 요청을 recv하고 그것을 처리 후 DB에 저장할 수 있습니까? 사용자는 브라우저에서 일반적인 상호 작용을 계속해야합니까? 뭔가 돌려 주어야합니까? – user2290820

답변

1

죄송합니다. 댓글 상자에 넣을 수 없습니다. 모든 요청은 결국 응답을 가져야합니다 (또는 실패/시간 초과). 실제로 클라이언트에 데이터를 반환 할 필요가없는 경우 상태 코드가 포함 된 빈 응답 만 반환하십시오. 요청의 처리 시간이 걸리는 경우 비동기 적으로 실행해야합니다, 셀러리이 들어오는 곳이다 그래서 귀하의 요청 처리기의 차단 구현 :.

def request_processor_long_running_blocking_func(request_data): 
    # process request data, which takes a lot of time 
    # result is probably written into db 
    pass 

def request_handler_func(request): 
    request_processor_long_running_blocking_func(request.data) 
    return HttpResponse(status=200) 

내가 이해하면 올바르게 당신이 피하려는 것입니다 request_processor_long_running_blocking_func을 비동기 적으로 실행하여 request_handler_func을 차단하지 않습니다. 웹 인터페이스를 다시로드 또는 아무것도되지 않도록,

from celery.task import task 

@task 
def request_processor_long_running_blocking_func(request_data): 
    # the task decorator wraps your blocking function, with celery's Task class 
    # which has a delay method available for you to call, which will run your function 
    # asynchronously on one of your celery background worker processes 
    pass 

def request_handler_func(request): 
    request_processor_long_running_blocking_func.delay(request.data) 
    # calling the function with delay won't block, it returns immediately 
    # and your response is sent back instantly 
    return HttpResponse(status=200) 

한 가지 더, 아약스 이러한 작업 요청을 보내, 그래서 사용자가를 전송 한 후 응용 프로그램을 계속 사용할 수 있습니다 :이이 같은 셀러리 해결 될 것 요청

+0

다시 시도한 후에 되돌리려하십시오. 덕분에 – user2290820

+0

과 한 가지 더. 이것은 mod_wsgi 아파치에서 실행되지 않을 것입니다. (mod_wsgi 아파치는 지원하지 않을 것입니다.) – user2290820

+0

아파치 + mod_wsgi와 함께 제공되는 장고 애플리케이션을 프로덕션 환경에서 실행 중이며 셀러리와 장고 셀러리를 사용합니다. 예를 들어 RabbitMQ와 같은 셀러리를위한 메시지 브로커가 필요합니다.하지만 이것은 완전히 외부 서비스이며, 필요한 경우 완전히 다른 시스템에서 실행될 수도 있습니다. – andrean