파이썬 플라스크 앱이 있습니다. 모든 요청에 여분의 스레드를 만들지 않고 특정 경로에 응답 할 때 동시성을 사용하고 싶습니다. (가) 반환하기 전에 여러 HTTP 요청을 발행 할 필요가플라스크 (Flask) 경로 내에서 스레드를 사용하는 방법
def sentence_numfound(path):
nf = util.NumFound(path)
return json.dumps(nf.results(path))
nf.results, 나는 병렬로하고 싶으면 다음과 같이
정의 경로가있다. 현재 나는 다음과 같이하고있다.
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()
문제는 모든 요청마다 새로운 스레드가 만들어지고 닫힐 수 없다는 것이다. 결국 파이썬은 더 이상의 스레드를 생성 할 수 없으므로 라우트는 오류로 실패합니다.
스레드를 다시 사용할 수있는 간단한 방법이 있습니까? 또는 동시성을 달성하는 또 다른 방법은 무엇입니까?
죄송하지만 답변이 아닙니다. 왜 스레드를 만들고 싶습니까? 'Werkzeug','Apahce','nginx' ... 이미이 기능이 있습니다. – emeth
아파치 등은 _incoming_ 요청에 대한 스레드를 생성 할 수 있지만 내 코드는 수신 요청 하나에 대해 _outgoing_ 많은 요청을 만들어야합니다. 네트워크 지연은 병목 현상이며 동시성은 엄청난 속도 향상을 가져옵니다. – elplatt
또한 답변이 아니지만 gevent/green 스레드를 사용 해본 적이 있습니까? 무언가가 많이 바뀌면 잘 작동 할 것입니다. http://sdiehl.github.io/gevent-tutorial/ 셀 룰리 같은 것을 펀치하고 사용할 수도 있습니다. 경로는 스피너를 반환 한 다음 최종 페이지로 리디렉션합니다. 모든 것이 돌아 오면 페이지. –