2015-02-04 5 views
0

로깅 모듈을 사용하여 서로 이야기하는 두 개의 HTTP 서버가 있습니다.로깅 모듈과 함께 로그 보내기 get stuck

다음
logger = logging.getLogger('cs') 
logger.setLevel(logging.DEBUG) 
logger.addHandler(HTTPHandler("localhost:7777", "/")) 
logger.warning('log from serverA') 

, 포스트 MSG와 서버 B가 응답 :를 디버깅하는 동안

class myHandler(BaseHTTPRequestHandler): 
    def do_GET(self): 
     logger = logging.getLogger('mach') 
     logger.setLevel(logging.DEBUG) 
     logger.addHandler(HTTPHandler("localhost:8888", "/",method='POST')) 
     print "1111" 
     logger.critical('POST from 7777') 
     print "2222" 
     return 

, I는 "1111"인쇄 볼

serverA = SocketServer.TCPServer(("", 8888), myHandler) 
serverB = SocketServer.TCPServer(("", 7777), myHandler) 

제 ServerA에이 서버 B에 GET 요청을 보낸다 out이지만 "2222"는 아니며 인쇄 명령 인 첫 번째 줄인 serverA의 do_POST 메소드에서 인쇄되지 않습니다. 그러나 wireshark를 사용하여 검사했을 때 포트 8888과 해당 POST 메시지에 TCP 패킷이 표시되는 것을 볼 수 있습니다.

그래서 serverA에서 어떻게 표시되지 않습니까?

+0

do_POST 메소드에 대해 작성했지만 코드에는이 메소드가 없습니다 (do_GET 만 해당). – akozin

+0

예,하지만 serverB의 myHandler에는 do_POST 함수가 있습니다. 그리고 어쨌든, POST 대신 A에서 B로 GET을 시도해 보았습니다. 여전히 멈췄습니다. serverA에서 첫 번째 인쇄를 볼 수 없습니다. POST에 문제가 없습니다. – user1047069

+0

POST 요청을 명령 줄을 통해 보내보십시오. HTTP 서버가 작동하는지 여부 : $ curl -v -d "POST from 7777"http : // localhost : 8888. 서버에서 인쇄하는 메시지는 터미널에 있어야합니다. – akozin

답변

0

두 서버간에 교착 상태가 있습니다. 반환하지 않습니다 다음은 응답을 수신 할 때 (또는 오류가 발생) 할 때까지, 즉

  • 서버 A가하는 GET 서버 B에 대한 요청 및 응답을 기다리는 블록를 보냅니다 :

    여기에 시나리오입니다
    logger.warning('log from serverA') 
    
  • 서버 B는 do_GET()에서 서버 A로부터 GET 요청을 받지만 회신을 보내지 않습니다. 대신 서버 A, 다음 서버 B에 다시 POST 요청을 전송 서버 A의 응답을 기다리고 블록 :

    logger.critical('POST from 7777') 
    
  • 이 두 서버는 단일 스레드, 둘 다 다른로부터의 응답을 기다리고 차단 , 따라서 교착 상태.