我有两个使用日志记录模块相互通信的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中看不到它会发生什么呢?
答案 0 :(得分:0)
两台服务器之间存在死锁。这是场景:
服务器A向服务器B发送GET请求,并向块发送等待响应,即在收到响应(或发生错误)之前,以下内容不会返回:
logger.warning('log from serverA')
服务器B在do_GET()
中收到来自服务器A的GET请求,但它没有发送回复。相反,它将POST请求发送回服务器A,然后服务器B 阻止等待来自服务器A的响应:
logger.critical('POST from 7777')
两个服务器都是单线程的,两个服务器都被阻塞等待另一个服务器的响应,因此出现死锁。