我正在处理的Bottle应用程序(在CherryPy之后)接收来自HTTP客户端的资源请求,这导致执行可能需要几个小时才能完成的任务。我想发送早期HTTP响应(例如202 Accepted
)并继续处理该任务。有没有办法在不使用MQ库和单独使用Python / Bottle的情况下实现这一目标?
例如:
from bottle import HTTPResponse
@route('/task')
def f():
longRunningTask() # <-- Anyway to make this asynchronous?
return bottle.HTTPResponse(status=202)
答案 0 :(得分:1)
我知道这个问题已经有好几年了,但是我发现@ahmed的回答是如此难以置信,以至于我认为我至少会分享我如何在应用程序中解决此问题。
我所做的只是利用Python现有的线程库,如下所示:
from bottle import HTTPResponse
from threading import Thread
@route('/task')
def f():
task_thread = Thread(target=longRunningTask) # create a thread that will execute your longRunningTask() function
task_thread.setDaemon(True) # setDaemon to True so it terminates when the function returns
task_thread.start() # launch the thread
return bottle.HTTPResponse(status=202)
使用线程可以使您保持一致的响应时间,同时仍具有相对复杂或耗时的功能。
我使用了uWSGI,因此请确保在您的uWSGI应用程序配置中启用了线程化。