2016-12-06 1 views
0

을 함수를 호출 있지만이 문제 만 경험 : ws 교환 처음 몇 메시지를 통해 서버에트위스트 반응기 내 모든 클라이언트가 완전히 동일한 환경을 가지고 내가 <code>twisted.internet.reactor</code>와 함께하는 데 문제가 스레드에서 제대로

그들은 제대로 connectTCP. 다음과 같이 약 1 분, 그들은 정의

def execute(self, message, callback=None): 
    print(">>>", message, flush=True) 
    reactor.callFromThread(self._client_protocol_instance.send, message, callback) 

self._client_protocol_instance.send 방법을 통해 서버에 메시지를 보내야합니다 :

def send(self, command, callback): 
    print("send", command, callback, flush=True) 
    timestamp = int(time() * 1000000) 
    msg = (command.strip() + " --timestamp:" + str(timestamp)) 
    if _self._debug: 
     _self._commands[str(timestamp)] = msg 
    if callback is not None: 
     _self._callbacks[str(timestamp)] = callback 
    payload = msg.encode() 
    _self._status_controller.set_state(payload) 
    self.sendMessage(payload) 

먼저 print 표준 출력에 표시하지만, 두 번째는하지 않습니다. send이 실행되지 않는다고 가정합니다. reactor.run() 이후에는 전체 프로그램에서 reactor에 대한 유일한 참조입니다.

이런 일이 발생하면 클라이언트의 프로세스를 강제 종료하면 서버에서 즉시 감지하므로 해당 시점에 연결이 아직 남아 있습니다.

이 문제의 원인은 무엇일까요?

답변

0

해결책을 찾았는데 문제는 메시지를 보내려고 할 때까지 이전 작업이 가끔 완료되지 않는다는 사실에 기인합니다.

나는 모든 cpu-heavy 응답 처리 로직을 스레드로 이동시켜 다른 메시지를 위해 reactor를 자유롭게함으로써 해결했다.

관련 문제