[英]How to use threads within a Flask route
我有一个python flask应用程序。 我想在响应特定路由时使用并发,而不在每个请求上创建额外的线程。
有一条路线定义如下:
def sentence_numfound(path):
nf = util.NumFound(path)
return json.dumps(nf.results(path))
nf.results()需要在返回之前发出多个http请求,我想并行执行它们。 目前,我正在这样做:
class NumFound:
def __init__(self, path):
queries = get_queries(path) # A list
self.__results = [{}] * len(queries)
self.queue = Queue.Queue()
for i, q in enumerate(queries):
self.queue.put((i, q))
def results(self):
num_workers = 31
for i in range(num_workers):
t = threading.Thread(target=self.worker)
t.daemon = True
t.start()
self.queue.join()
return self.__results
def worker(self):
while True:
i, q = self.queue.get()
self.__results[i] = foo(q)
self.queue.task_done()
问题在于,每个请求都会创建新线程,并且无法关闭它们。 最终,路由失败并出现错误,因为python无法创建更多线程。
有没有简单的方法可以重用线程? 还是实现并发的另一种方法?
我认为您将使用multiprocessing.Pool接近实现。
您可以按以下步骤建立工作人员池:
from multiprocessing import Pool
pool = Pool(processes=31)
然后,您需要做的所有工作就是将作业提交到池中,并等待所有作业完成。 我无法对此进行测试,因为您没有提供足够的代码,但是它看起来或多或少像这样:
def sentence_numfound(path):
return jsonify(pool.map(foo, get_queries(path)))
对于池所拥有的进程中的每个查询,这基本上都是并行调用的foo(query)
。 完成所有作业后, map()
调用将返回。 返回值是一个数组,其结果与输入数组的顺序相同。
我希望这有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.