#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package ReloadModule
|
#
|
# @todo:ÖØ¶Á½Å±¾Ä£¿é
|
# @author hxp
|
# @date 2016-8-5
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ÖØ¶Á½Å±¾Ä£¿é£¬½ö¶Ô±ä¸üµÄ½Å±¾ÖضÁ£¬ÓÅ»¯ÈȲ¿Êð
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2016-8-5 19:00"""
|
#-------------------------------------------------------------------------------
|
|
import GameWorld
|
import ShareDefine
|
import QuestManager
|
import EventShell
|
import ChConfig
|
|
import sys
|
import os
|
|
g_moduleFileCMTimeDict = {} # Ä£¿éÎļþ´´½¨¼°ÐÞ¸Äʱ¼ä
|
|
## ˢнű¾Ä£¿é´´½¨¼°ÐÞ¸Äʱ¼ä
|
def __RefreshModuleFileCMTime():
|
global g_moduleFileCMTimeDict
|
|
g_moduleFileCMTimeDict = {}
|
GameWorld.Log("ˢнű¾Îļþʱ¼ä...")
|
for parent, dirnames, filenames in os.walk(ChConfig.ScriptPath):
|
#DebugLog("parent=%s, dirnames=%s" % (parent, dirnames))
|
for filename in filenames:
|
if "py" not in filename:
|
continue
|
fullPath = os.path.join(parent, filename)
|
ctime = os.path.getctime(fullPath) # »ñÈ¡ÎļþµÄ´´½¨Ê±¼ä
|
mtime = os.path.getmtime(fullPath) # »ñÈ¡ÎļþµÄÐÞ¸Äʱ¼ä
|
#DebugLog(" filename=%s, fullPath=%s" % (filename, fullPath))
|
g_moduleFileCMTimeDict[filename] = [ctime, mtime]
|
GameWorld.Log(" ½Å±¾×ÜÊý: %s" % len(g_moduleFileCMTimeDict))
|
|
return
|
|
## Ä£¿é½Å±¾Èȸü, ÓÉGameServer¿ØÖƹ㲥´¥·¢
|
def DoMapServerScriptReload(updVersion, tick):
|
|
curVersion = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_MapServerScriptReloadVersion)
|
# ÕâÀïg_moduleFileCMTimeDict»á±ä¿ÕÒ»°ãÊÇÒòΪdebugÆÚ¼äʹÓÃÁËÖØ¶ÁËùÓнű¾µ¼Ö£¬Ò»°ãÕýʽ»·¾³²»ÔÙʹÓÃ֮ǰµÄÖØ¶Á½Å±¾£¬ËùÒÔ²»»áÓпյÄÇé¿ö
|
if not curVersion or not g_moduleFileCMTimeDict:
|
__RefreshModuleFileCMTime()
|
return
|
|
if curVersion == updVersion:
|
return
|
|
GameWorld.Log("¿ªÊ¼½Å±¾ÖضÁ curVersion=%s,updVersion=%s" % (curVersion, updVersion))
|
moduleNameDict = {}
|
isReloadMission = False
|
|
for moduleKey, module in sys.modules.items():
|
if "py" not in str(module):
|
#GameWorld.DebugLog(" not py module: %s=%s" % (moduleKey, module))
|
continue
|
|
moduleName = moduleKey.split(".")[-1]
|
moduleList = moduleNameDict.get(moduleName, [])
|
moduleList.append(moduleKey) # ÓÐЩģ¿é»á²úÉú¶à¸ö...£¿
|
moduleNameDict[moduleName] = moduleList
|
|
for parent, dirnames, filenames in os.walk(ChConfig.ScriptPath):
|
#DebugLog("parent=%s, dirnames=%s" % (parent, dirnames))
|
for filename in filenames:
|
if "py" not in filename:
|
continue
|
|
curModuleName = filename.split('.')[0]
|
if curModuleName == __name__:
|
#GameWorld.DebugLog(" ±¾½Å±¾²»¸üÐÂ: %s" % curModuleName)
|
continue
|
|
fullPath = os.path.join(parent, filename)
|
curCTime = os.path.getctime(fullPath) # »ñÈ¡ÎļþµÄ´´½¨Ê±¼ä
|
curMTime = os.path.getmtime(fullPath) # »ñÈ¡ÎļþµÄÐÞ¸Äʱ¼ä
|
if filename in g_moduleFileCMTimeDict:
|
ctime, mtime = g_moduleFileCMTimeDict[filename]
|
# ʱ¼äÏàͬ´ú±í½Å±¾Ã»±ä£¬²»½øÐÐÖØ¶Á
|
if ctime == curCTime and mtime == curMTime:
|
#GameWorld.DebugLog(" not change %s : %s" % (filename, fullPath))
|
continue
|
g_moduleFileCMTimeDict[filename] = curCTime, curMTime
|
|
if curModuleName in moduleNameDict:
|
for moduleKey in moduleNameDict[curModuleName]:
|
__DoModuleReload(moduleKey)
|
|
if curModuleName in ["QuestCommon", "QuestManager", "QuestRunner"]:
|
isReloadMission = True
|
|
# ÅжϽű¾ÎļþÊÇ·ñÓÐÐ޸ģ¬ÈçÓÐÐÞ¸ÄÔò½øÐÐÖØ¶ÁÈÎÎñ
|
|
# ÖØ¶ÁÈÎÎñ¿ÉÄÜÓÐÒ»¶¨·çÏÕ£¬ÐèÏêϸ²âÊÔ
|
if isReloadMission:
|
QuestManager.ReloadQuests(tick)
|
EventShell.DoReloadRefresh()
|
|
GameWorld.Log(" ½Å±¾ÖضÁ OK! isReloadMission=%s" % isReloadMission)
|
return
|
|
def __DoModuleReload(moduleKey):
|
module = sys.modules.get(moduleKey)
|
if not module:
|
return
|
try:
|
# ÕâÀïÏȽøÐмòµ¥µÄÖ±½ÓÖØ¶Á£¬ÈçÓÐÐèÒª£¬¿ÉÓÅ»¯ÖضÁÂß¼£¬ÊµÏÖ²»Í¬µÄÖØ¶ÁÐèÇó£¬Èç±£ÁôÈ«¾Ö±äÁ¿ÖµµÈ
|
# Ŀǰֱ½ÓÖØ¶ÁÒѾ¿ÉÒÔÓ¦¶Ô´ó²¿·ÖÐèÇ󣬹ÊÔݲ»×öÖ§³Ö
|
reload(module)
|
GameWorld.Log(" reload module %s, %s" % (moduleKey, module))
|
except Exception:
|
GameWorld.ErrLog(" reload module err! %s, %s" % (moduleKey, module))
|
return
|
|
|
|
|
|
|