在apache服务器上运行gevent + mod_wsgi + bottle

时间:2013-08-14 11:38:20

标签: python-2.7 apache2 celery mod-wsgi bottle

我看了http://bottlepy.org/docs/dev/tutorial_app.html#server-setup

running Apache + Bottle + Python

Bottle + Apache + WSGI + Sessions

我想知道是否可以对mod_wsgi服务器上的瓶子运行异步休息api调用到不返回任何内容的py函数(它的后端逻辑)并且是非阻塞的 - 所以我查找gevent但是我是还没有找到一个可以用gevents运行mod_wsgi的解决方案。

是否有使用mod_wsgi或其他替代方法在apache服务器上运行异步调用的任何解决方案?

更新 根据andreans在下面的回答;

我用瓶子+芹菜运行了一个简单的myip地址返回。所以必须运行celery作为@ celery.task然后运行(host ='localhost',port = 8080,debug = True)?是否需要在终端上启动芹菜工人?从来没有在[runnin local]之前使用芹菜也运行带装饰器的瓶子@route(/ something)有效,但app.route并不在app = Bottle()可能是由于某些.wsgi文件错误?

1 个答案:

答案 0 :(得分: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)

还有一件事,使用ajax发送这些任务请求,因此您的Web界面将不会被重新加载或任何内容,因此用户可以在发送请求后继续使用您的应用程序