python3使用importlib來重複加載模塊

#-*- coding:utf-8 -*-
from socketserver import ThreadingTCPServer, BaseRequestHandler
import importlib
import traceback
import time
import logging
logging.basicConfig(level=logging.DEBUG,
  filename="log/xxgl_%s.log" % (time.strftime("%Y%m%d", time.localtime())),
  filemode='a',
  format='%(asctime)s-%(filename)s[line:%(lineno)d]-%(levelname)s: %(message)s')
module_list = {}socket

class MyBaseRequestHandler(BaseRequestHandler):
def handle(self):
  #循環監聽(讀取)來自客戶端的數據
  while True:
    try:
      #一次讀取1024字節,並去除兩端的空白字符(包括空格,TAB,\r,\n)
      data = self.request.recv(1024).strip()
      data = data.decode()
      if data == '':
        breakdebug

      #self.client_address是客戶端的鏈接(host, port)的元組
      logging.info("receive from %r: [%r]" % (self.client_address, data))
      ret = self.exec_sub(data, data)
      self.request.sendall(ret.encode())
    except:
      #traceback.print_exc() #當客戶端主動斷開鏈接時,self.recv(1024)會拋出異常
      breakcode

def findModule(self, procName):
  try:
    return module_list[procName]
  except:
    logging.debug("module_list[%s] not found" % (procName))
    return Noneorm

#根據報文名稱調用對應的模塊,並傳遞參數,將執行結果返回給客戶端
def exec_sub(self, procName, params):
  try:
    proc = self.findModule(procName)
    logging.debug(str(proc))
    if proc == None:
      proc = importlib.import_module(procName)
      module_list[procName] = proc
      logging.debug('import_module: ' + procName)
    else:
      importlib.reload(proc)
      time.sleep(1) #不延時會從新加載失敗
      logging.debug('reload: ' + procName)
    result = proc.call_sub(params)
    return result
  except Exception as e:
    logging.error(str(e))
    return "error"server

if __name__ == "__main__":
  host = "" #主機名,能夠是ip,像localhost的主機名,或""
  port = 9999 #端口
  addr = (host, port)
  server = ThreadingTCPServer(addr, MyBaseRequestHandler)
  server.serve_forever()ip

相關文章
相關標籤/搜索