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



我已阅读http://bottlepy.org/docs/dev/tutorial_app.html#server-设置

并运行Apache+Bottle+Python

和Bottle+Apache+WSGI+Sessions

我想知道是否可以在mod_wsgi服务器上对一个不返回任何内容(这是一个后端逻辑)且无阻塞的py函数运行异步rest api调用来bottle-所以我查找了gevent,但我还没有找到一个可以使用gevent运行mod_wsgi的解决方案。

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

更新按照下面安德烈的回答;

我用瓶子+芹菜做了一个简单的myip地址返回。所以必须以@celery.task的形式运行芹菜,然后运行(host='localhost',port=8080,debug=True)?是否也需要启动终端上的芹菜工人?以前从未使用过芹菜[runninlocal]也使用decorator@route(something)运行过bottle,但app.route没有在app=bottle()的位置运行,可能是由于一些.wsgi文件错误?

抱歉,无法放入评论框。每个请求最终都必须得到响应(或失败/超时)。如果您真的不需要向客户端返回任何数据,只需发回一个带有状态代码的空响应。如果处理请求需要时间,那么它应该异步运行,这就是芹菜的用武之地

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界面就不会被重新加载,这样用户就可以在发送请求

后继续使用你的应用程序

相关内容

  • 没有找到相关文章

最新更新