2014-04-18 1 views
2

파이썬 플라스크 앱이 있습니다. 모든 요청에 ​​여분의 스레드를 만들지 않고 특정 경로에 응답 할 때 동시성을 사용하고 싶습니다. (가) 반환하기 전에 여러 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() 

문제는 모든 요청마다 새로운 스레드가 만들어지고 닫힐 수 없다는 것이다. 결국 파이썬은 더 이상의 스레드를 생성 할 수 없으므로 라우트는 오류로 실패합니다.

스레드를 다시 사용할 수있는 간단한 방법이 있습니까? 또는 동시성을 달성하는 또 다른 방법은 무엇입니까?

+0

죄송하지만 답변이 아닙니다. 왜 스레드를 만들고 싶습니까? 'Werkzeug','Apahce','nginx' ... 이미이 기능이 있습니다. – emeth

+0

아파치 등은 _incoming_ 요청에 대한 스레드를 생성 할 수 있지만 내 코드는 수신 요청 하나에 대해 _outgoing_ 많은 요청을 만들어야합니다. 네트워크 지연은 병목 현상이며 동시성은 엄청난 속도 향상을 가져옵니다. – elplatt

+0

또한 답변이 아니지만 gevent/green 스레드를 사용 해본 적이 있습니까? 무언가가 많이 바뀌면 잘 작동 할 것입니다. http://sdiehl.github.io/gevent-tutorial/ 셀 룰리 같은 것을 펀치하고 사용할 수도 있습니다. 경로는 스피너를 반환 한 다음 최종 페이지로 리디렉션합니다. 모든 것이 돌아 오면 페이지. –

답변

3

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() 호출이 반환됩니다. 반환 값은 입력 배열과 같은 순서로 결과가있는 배열입니다.

도움이 되었기를 바랍니다.

+0

위대한 작품! 'Pool()'을 만들기 전에'foo()'를 정의했는지 확인해야했습니다. – elplatt

관련 문제