您应该更改代码,以便工作人员可以并行工作:
@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容器产生多个工作程序,因此在您的代码等待任务结果时,只会阻止一个工作程序。
对于这种应用程序,我建议使用gevent,它会为每个请求生成一个单独的greenlet,并且非常轻巧。



