Python 如何在烧瓶路径中使用线程

Python 如何在烧瓶路径中使用线程,python,multithreading,concurrency,flask,Python,Multithreading,Concurrency,Flask,我有一个python烧瓶应用程序。我希望在响应特定路由时使用并发性,而不在每个请求上创建额外的线程 有一条路线定义如下: def sentence_numfound(path): nf = util.NumFound(path) return json.dumps(nf.results(path)) from multiprocessing import Pool pool = Pool(processes=31) nf.results()需要在返回之前发出多个http请求,

我有一个python烧瓶应用程序。我希望在响应特定路由时使用并发性,而不在每个请求上创建额外的线程

有一条路线定义如下:

def sentence_numfound(path):
    nf = util.NumFound(path)
    return json.dumps(nf.results(path))
from multiprocessing import Pool
pool = Pool(processes=31)
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无法创建更多线程


有没有一种简单的方法可以重用线程?还是另一种实现并发性的方法?

我认为您可以使用

您可以按如下方式设置工作人员池:

def sentence_numfound(path):
    nf = util.NumFound(path)
    return json.dumps(nf.results(path))
from multiprocessing import Pool
pool = Pool(processes=31)
然后,您的路由需要做的就是将作业提交到池中,并等待所有作业完成。我无法对此进行测试,因为您没有提供足够的代码,但它看起来可能或多或少像这样:

def sentence_numfound(path):
    return jsonify(pool.map(foo, get_queries(path)))
这基本上是为池所拥有的进程中的每个查询调用
foo(query)
,所有这些都是并行的。所有作业完成后,
map()
调用将返回。返回值是一个包含结果的数组,其顺序与输入数组相同


我希望这有帮助

对不起,这不是答案。为什么要创建线程
Werkzeug
Apahce
nginx
。。。Apache等已经具备了为传入请求创建线程的能力,但是我的代码需要为一个传入请求生成多个传出请求。网络延迟是瓶颈,并发性带来了巨大的加速。这也不是答案,但您是否考虑过使用gevent/green线程?对于一些i/o严重受限的东西,它可能会很好地工作:你也可以使用类似芹菜的东西——路线返回一个旋转器,然后在所有东西返回时重定向到最后一页。非常好!在创建
池()之前,我必须确保定义
foo()