您应该更改代码,以便工作人员可以并行工作:
@myapp.route('/foo')
def bar():
# start tasks
task_1 = a_long_process.delay(x, y)
task_2 = another_long_process.delay(x, y)
task_3 = yet_another_long_process.delay(x, y)
# fetch results
try:
task_1_result = task_1.get(timeout=1)
task_2_result = task_2.get(timeout=1)
task_3_result = task_3.get(timeout=1)
except TimeoutError:
# Handle this or don't specify a timeout.
raise
# combine results
return task_1 + task_2 + task_3
该代码将阻塞,直到所有结果可用(或达到超时)为止。
在执行过程中,Flask应用程序是否会被阻止?
此代码将仅阻止WSGI容器的一名工作人员。整个站点是否没有响应取决于您使用的WSGI容器。(例如Apache + mod_wsgi,uWSGI,gunicorn等)。大多数WSGI容器产生多个工作程序,因此在您的代码等待任务结果时,只会阻止一个工作程序。