#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package ReloadModule
|
#
|
# @todo:ÖØ¶Á½Å±¾Ä£¿é
|
# @author hxp
|
# @date 2016-8-5
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ÖØ¶Á½Å±¾Ä£¿é£¬½ö¶Ô±ä¸üµÄ½Å±¾ÖضÁ£¬ÓÅ»¯ÈȲ¿Êð
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2016-8-5 19:00"""
|
#-------------------------------------------------------------------------------
|
|
import ReadChConfig
|
import ShareDefine
|
import GameWorld
|
import ChConfig
|
|
import sys
|
import os
|
|
g_moduleFileCMTimeDict = {} # Ä£¿éÎļþ´´½¨¼°ÐÞ¸Äʱ¼ä
|
|
## ˢнű¾Ä£¿é´´½¨¼°ÐÞ¸Äʱ¼ä
|
def RefreshModuleFileCMTime(isServerInitOK):
|
global g_moduleFileCMTimeDict
|
|
isOpenChagneReload, GameServerReloadVersion, MapServerReloadVersion = ReadChConfig.GetEvalChConfig("PyReloadVersion")
|
if not isOpenChagneReload:
|
return
|
|
g_moduleFileCMTimeDict = {}
|
GameWorld.Log("ˢнű¾Îļþʱ¼ä isServerInitOK=%s" % isServerInitOK)
|
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))
|
|
if isServerInitOK:
|
GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_GameServerScriptReloadVersion, GameServerReloadVersion)
|
GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_MapServerScriptReloadVersion, MapServerReloadVersion)
|
GameWorld.Log(" GameServerReloadVersion=%s,MapServerReloadVersion=%s" % (GameServerReloadVersion, MapServerReloadVersion))
|
|
return
|
|
## Ä£¿é½Å±¾Èȸü
|
## ´Ë¹¦Äܲ»Í¨¹ý½Å±¾ÖضÁ´¥·¢£¬ÓÉÓڽű¾ÖضÁÔÚC++ÖÐÒÑĬÈÏÖØ¶ÁËùÓнű¾Îļþ, ½öÔÚÖØ¶ÁÅäÖÃÖд¥·¢¼ì²é
|
def DoModuleHotUpdate():
|
isOpenChagneReload, GameServerReloadVersion, MapServerReloadVersion = ReadChConfig.GetEvalChConfig("PyReloadVersion")
|
if not isOpenChagneReload:
|
return
|
|
__DoGameServerScriptReload(GameServerReloadVersion)
|
__Broadcast_MapServerScriptReload(MapServerReloadVersion)
|
return
|
|
## ¹ã²¥¸÷µØÍ¼£¬Í¨Öª½øÐнű¾¸üÐÂ
|
def __Broadcast_MapServerScriptReload(MapServerReloadVersion):
|
curMSVersion = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_MapServerScriptReloadVersion)
|
|
if curMSVersion == MapServerReloadVersion:
|
GameWorld.Log("MapServer½Å±¾°æ±¾Ïàͬ²»ÖضÁ, curMSVersion=%s" % curMSVersion)
|
return
|
|
# ֪ͨµØÍ¼½Å±¾ÖضÁ
|
GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_MapServerScriptReloadVersion, MapServerReloadVersion)
|
GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_MapServerScriptReloadVersion, MapServerReloadVersion)
|
GameWorld.Log("֪ͨMapServer½Å±¾ÖضÁ, mapServerVersion=%s" % MapServerReloadVersion)
|
return
|
|
|
def __DoGameServerScriptReload(GameServerReloadVersion):
|
global g_moduleFileCMTimeDict
|
|
# ÕâÀï»á±ä¿ÕÒ»°ãÊÇÒòΪdebugÆÚ¼äʹÓÃÁËÖØ¶ÁËùÓнű¾µ¼Ö£¬Ò»°ãÕýʽ»·¾³²»ÔÙʹÓÃ֮ǰµÄÖØ¶Á½Å±¾£¬ËùÒÔ²»»áÓпյÄÇé¿ö
|
if not g_moduleFileCMTimeDict:
|
RefreshModuleFileCMTime(False)
|
return
|
|
curGSVersion = GameWorld.GetGameWorld().GetDictByKey(ShareDefine.Def_Notify_WorldKey_GameServerScriptReloadVersion)
|
|
if curGSVersion == GameServerReloadVersion:
|
GameWorld.Log("GameServer½Å±¾°æ±¾Ïàͬ²»ÖضÁ, curGSVersion=%s" % curGSVersion)
|
return
|
|
GameWorld.Log("GameServer¿ªÊ¼½Å±¾ÖضÁ GameServerReloadVersion=%s" % GameServerReloadVersion)
|
moduleNameDict = {}
|
GameWorld.GetGameWorld().SetDict(ShareDefine.Def_Notify_WorldKey_GameServerScriptReloadVersion, GameServerReloadVersion)
|
|
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)
|
|
GameWorld.Log(" GameServer½Å±¾ÖضÁ OK!")
|
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
|
|
|
|
|
|
|