📄 imcontrol.pyc_dis
字号:
#! /usr/bin/env python
# emacs-mode: -*- python-*-
import logging
import cgi
import string
import urllib
import cStringIO
import time
import urlparse
from zope.interface import implements
import twisted.internet.interfaces
import Image
import const
import config
import control
from MSNAgent import MSNAgent
miReqTimeoutCounter = 0
log = logging.getLogger(const.CONST_APP_LOGGER)
mlRequestList = []
class RedirectReq:
implements(twisted.internet.interfaces.IProducer, twisted.internet.interfaces.IConsumer)
def __init__(self, aoRequest):
self.ciID = control.miRequestID
log.debug(("im req id:%d" % self.ciID))
control.miRequestID += 1
self.coRequest = aoRequest
self.ciStartTime = time.time()
self.cbTimeout = False
self.csReq = self.coRequest.csGetIData()
if (not self.cbParseQuery()):
aoRequest.write("解释错误")
return
mlRequestList.append(self)
self.coRequest.registerProducer(self, False)
def cnCheckTimeout(self):
"""
自我检查是否超时了
"""
global miReqTimeoutCounter
if (self.cbTimeout or ((time.time() - self.ciStartTime) < config.request_timeout)):
return
log.debug(("(%d)%s is timeout" % (self.ciID,
self.coImage.csSrc)))
miReqTimeoutCounter += 1
self.cbTimeout = True
if self.coWaitReq:
self.coWaitReq.cnRemoveSameReq(self)
self.cnRspZero(True)
if (len(self.clDupReq) > 0):
log.debug(("some req is depending on (%d) add back to reqlist" % self.ciID))
mlRequestList.append(self)
def registerproducer(self, aoProducer):
"""
添加生产者,不同阶段,我们的生产者是不一样的
"""
aoProducer.cnAddConsumer(self)
aoProducer.resumeProducing()
registerProducer = registerproducer
def resumeProducing(self):
pass
def write(self, aoData):
"""
处理web返回的数据
"""
self.cnHandleRspData(aoData)
def stopProducing(self):
"""
客户端自行断开的时候,会调用这个函数
但我们不会停止,因为要继续把任务完成以保证下次再
请求的时候能够命中cache
"""
self.cbClientDisconnected = True
def cnHandleRspData(self, asWebData):
"""
读取web的数据,保存cache,请求resize agent
"""
self.cnRsp("200", {}, asWebData)
def cnRsp(self, aiRspCode, adHeaders, asRspData, abTimeout = False):
log.debug(("(%d) response with %d data" % (self.ciID,
len(asRspData))))
try:
mlRequestList.remove(self)
except:
pass
if self.coRequest:
self.coRequest.headers = adHeaders
self.coRequest.cnSetRspCode(str(aiRspCode))
self.coRequest.unregisterProducer()
self.coRequest.write(asRspData)
self.coRequest.finish()
self.coRequest = None
def cnRspZero(self, abTimeout = False):
ldHeaders = {}
self.cnRsp(twisted.web.http.OK, ldHeaders, "", abTimeout)
def connectionLost(self, reason):
log.warn(("(%d)client lost connection,reason:%s" % (self.ciID,
reason)))
def cnSetWebRspHeader(self, adHeaders):
self.cdWebRspHeader = adHeaders
def cnSetResizeRspHeader(self, adHeaders):
self.cdResizeRspHeader = adHeaders
class MSNRequest(RedirectReq):
HEADER_SN = "user_sn"
HEADER_MSG_SEQ = "msg_seq"
HEADER_ROSTER_SEQ = "roster_seq"
def __init__(self, aoRequest):
self.csSN = None
self.csMsgSeq = None
self.csRosterSeq = None
RedirectReq.__init__(self, aoRequest)
def cbParseQuery(self):
self.csSN = self.coRequest.csGetHeader(self.HEADER_SN)
self.csMsgSeq = self.coRequest.csGetHeader(self.HEADER_MSG_SEQ)
self.csRosterSeq = self.coRequest.csGetHeader(self.HEADER_ROSTER_SEQ)
return True
def resumeProducing(self):
self.registerProducer(MSNAgent)
miIterCount = 1
def mnTimeoutHandler():
"""
对超时了的任务及时返回
"""
global miIterCount
miIterCount += 1
for i in xrange((len(mlRequestList) - 1), -1, -1):
mlRequestList[i].cnCheckTimeout()
if ((miIterCount % config.request_report_interval) == 0):
liTimeoutCount = 0
for req in mlRequestList:
if req.cbTimeout:
liTimeoutCount += 1
log.debug(("%d req working,%d timeouted,%d req waiting" % (len(mlRequestList),
liTimeoutCount,
len(WebAgent.clConsumer))))
log.info(("total %d req served, %d timeouted" % (miRequestID,
miReqTimeoutCounter)))
log.info(("web access statistics:%s" % `webagent.mdWebRspStat`))
log.info(("cache statistics req(%d) hit(%d)" % (cachemgr.miCacheReqCounter,
cachemgr.miCacheHitCounter)))
# local variables:
# tab-width: 4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -