繁体   English   中英

如何在Flask路由中使用线程

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM