2017-11-19 7 views
-1
class Client(tornado.websocket.WebSocketHandler): 
    def open(self): 
     print "Connection is opened" 

    def on_message(self, message): 
     self.Process(message) 

    def on_close(self): 
     print "socket closed" 

위의 코드는 python/tornado로 가정합니다. Client의 인스턴스는 새 websocket 클라이언트가 서버에 연결할 때 만들어집니다. 문제는 self.process(message)이 진행되는 동안 처리가 완료되고 전체 처리기가 차단되어 (연결을 수락하거나 메시지를받지 않음) self.process(message)이 진행 중일 때입니다. 이 장애물을 극복하기위한 해결책이 있습니까?토네이도 비 차단 웹 소켓 서버 구현

+0

'self.process' 메소드를 별도의 스레드에서 시도해 볼 수 있습니다. CPU 집약적 인 작업 인 경우 별도의 스레드에서 실행하는 대신 사용할 수 없습니다. 네트워크 연결 작업 인 경우 해당 작업에 대한 비동기 라이브러리를 찾거나 직접 작성할 수 있습니다. – xyres

+0

편집 [마지막 코멘트에서 일부 언어가 혼란 스럽습니다] : ['max_workers'] (https://docs.python.org/3.5/library/concurrent.futures.html#concurrent)로 스레드 수를 제한 할 수 있습니다. futures.ThreadPoolExecutor) 인수를 사용합니다. 따라서 한 번에 제한된 수의 요청 만 처리되고 나머지는 대기열에 저장됩니다. – xyres

+0

방금 ​​'ThreadPoolExecutor'가 생겼습니다. 나는 이것이 이것을위한 좋은 라이브러리라고 생각한다. –

답변

0

여기서 얻을 수있는 기본 코드는 ThreadPoolExecutor 시작 : 당신이 그것을 처리 한 후 on_message에서 메시지에 액세스하려는 경우

import concurrent.futures 

# create a `ThreadPoolExecutor` instance 
executor = concurrent.futures.ThreadPoolExecutor(max_workers=8) 


class Client(tornado.websocket.WebSocketHandler): 

    def on_message(self, message): 
     # ask `executor` to run `self.process` in a thread 
     executor.submit(self.process, message) 

    def process(self, message): 
     # do something blocking ... 
     return processed_message 

, 당신은 gen.coroutine 다음 yield 함께 장식했습니다 : executor.submit(...) :

from tornado import gen 

class Client(tornado.websocket.WebSocketHandler): 

    # decorate on_message with gen.coroutine 
    @gen.coroutine 
    def on_message(self, message): 
     # now use the yield keyword 
     processed_message = yield executor.submit(self.process, message) 
     # do something with processed_message 

    def process(self, message): 
     # do something blocking ... 
     return processed_message 
+0

8 명의 근로자가 얼마나 오래 살아 남았습니까? 첫 번째 req가 처리되었다고 가정하면 풀의 스레드가 종료됩니까? 아니면 아직 살아 있니? –

+0

@MehrdadDadvand 수영장의 근로자는 항상 살아 있습니다. 스레드를 시작하고 중지하는 데 걸리는 시간을 줄이려면이 작업이 중요합니다. – xyres

+0

그게 훌륭합니다. 고맙습니다. 도움이 됐어. –