imcontrol.pyc_dis
来自「Cache服务器模块,可以完成图片的缓存处理功能. 很好用的.」· PYC_DIS 代码 · 共 195 行
PYC_DIS
195 行
#! /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 + =
减小字号Ctrl + -
显示快捷键?