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