⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imcontrol.pyc_dis

📁 Cache服务器模块,可以完成图片的缓存处理功能. 很好用的.
💻 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 + -