发送带有日志记录模块的日志会卡住

时间:2015-02-04 06:20:46

标签: python logging

我有两个使用日志记录模块相互通信的http服务器。

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

第一个serverA向服务器B发送GET请求:

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

然后,serverB以POST消息:

回答
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

在调试时,我看到" 1111"打印出来,但" 2222"并非如此,并且在serverA的do_POST方法中,第一行是打印命令 - 不会打印出来。 但是,当我用wireshark检查它时,我看到一个tcp数据包进入端口8888及其我的POST信息..

那么我在服务器A中看不到它会发生什么呢?

1 个答案:

答案 0 :(得分:0)

两台服务器之间存在死锁。这是场景:

  • 服务器A向服务器B发送GET请求,并向发送等待响应,即在收到响应(或发生错误)之前,以下内容不会返回:

    logger.warning('log from serverA')
    
  • 服务器B在do_GET()中收到来自服务器A的GET请求,但它没有发送回复。相反,它将POST请求发送回服务器A,然后服务器B 阻止等待来自服务器A的响应:

    logger.critical('POST from 7777')
    
  • 两个服务器都是单线程的,两个服务器都被阻塞等待另一个服务器的响应,因此出现死锁。