From: Anthony Geay Date: Tue, 5 Mar 2024 17:07:30 +0000 (+0100) Subject: [EDF29576] : make it better X-Git-Url: http://git.salome-platform.org/gitweb/?a=commitdiff_plain;h=5013bb875a4f2b2ed74c87a6830c2c6e592e1d14;p=modules%2Fyacs.git [EDF29576] : make it better --- diff --git a/src/yacsloader/driver_internal.py b/src/yacsloader/driver_internal.py index 4fa233d48..59f321ca6 100644 --- a/src/yacsloader/driver_internal.py +++ b/src/yacsloader/driver_internal.py @@ -228,7 +228,6 @@ def executeGraph( executor, xmlfilename, proc, dump, finalDump, display, shutdow HTopOfAllServersTimeRes (int) : time in second between two measures of CPU/Mem of any of server """ import SALOMERuntime - dump_thread = None import pilot import os import contextlib @@ -245,48 +244,55 @@ def executeGraph( executor, xmlfilename, proc, dump, finalDump, display, shutdow self._proc.shutdown(self._shutdown) salome.dsm.shutdownScopes() my_runtime_yacs.fini( False ) + + class AutoDumpThread: + def __init__(self, proc, dump, xmlfilename): + self._dumpFile = "dumpState_{}".format( os.path.basename(xmlfilename) ) + self._lockFile = "{}.lock".format( os.path.splitext( os.path.basename(xmlfilename) )[0] ) + def __enter__(self): + logging.info(f"Ready to launch thread of state dump with dumpFile = {self._dumpFile} lockFile = {self._lockFile}") + self._dump_thread = SALOMERuntime.ThreadDumpState(proc,dump,dumpFile,lockFile) + self._dump_thread.start() + def __exit__(self,exctype, exc, tb): + self._dump_thread.join() def MonitoringDirectories( DirectoriesToMonitor ): import SALOME_PyNode if len( DirectoriesToMonitor ) > 0: return [ SALOME_PyNode.GenericPythonMonitoringLauncherCtxMgr( SALOME_PyNode.FileSystemMonitoring(timeRes*1000,zeDir,zeDirRes) ) for zeDir,zeDirRes,timeRes in DirectoriesToMonitor ] else: - return [ contextlib.nullcontext() ] + return [ ] def MonitoringThisProcess(HTopOfThisProcessFile,HTopTimeRes): import SALOME_PyNode if HTopOfThisProcessFile: - return SALOME_PyNode.GenericPythonMonitoringLauncherCtxMgr( SALOME_PyNode.CPUMemoryMonitoring(1000*HTopTimeRes,HTopOfThisProcessFile) ) + return [ SALOME_PyNode.GenericPythonMonitoringLauncherCtxMgr( SALOME_PyNode.CPUMemoryMonitoring(1000*HTopTimeRes,HTopOfThisProcessFile) ) ] else: - return contextlib.nullcontext() + return [ ] def MonitoringAllKernelServers(HTopOfAllServersFile, HTopOfAllServersTimeRes): if HTopOfAllServersFile: - return salome.LogManagerLaunchMonitoringFileCtxMgr( 1000*HTopOfAllServersTimeRes, HTopOfAllServersFile ) + return [ salome.LogManagerLaunchMonitoringFileCtxMgr( 1000*HTopOfAllServersTimeRes, HTopOfAllServersFile ) ] else: - return contextlib.nullcontext() + return [ ] + + # + salome.cm.SetDeltaTimeBetweenCPUMemMeasureInMilliSecond( 1000*CPUMemContainerTimeRes ) + # Start part of context manager instances + ctxManagers = MonitoringDirectories( DirectoriesToMonitor ) + MonitoringThisProcess(HTopOfThisProcessFile, HTopTimeRes) + MonitoringAllKernelServers(HTopOfAllServersFile, HTopOfAllServersTimeRes) # if dump != 0: - dumpFile = "dumpState_{}".format( os.path.basename(xmlfilename) ) - lockFile = "{}.lock".format( os.path.splitext( os.path.basename(xmlfilename) )[0] ) - dump_thread = SALOMERuntime.ThreadDumpState(proc,dump,dumpFile,lockFile) - dump_thread.start() + ctxManagers += [ AutoDumpThread(proc,dump,xmlfilename) ] # - salome.cm.SetDeltaTimeBetweenCPUMemMeasureInMilliSecond( 1000*CPUMemContainerTimeRes ) + ctxManagers += [ AutoShutdown(proc,shutdown) ] + # end of part of context managers + with contextlib.ExitStack() as stack: + for mgr in ctxManagers: + stack.enter_context(mgr) + executor.RunPy(proc,display,isPyThread=True,fromscratch=True) # same as RunW but releasing GIL # - ctxManagers = MonitoringDirectories( DirectoriesToMonitor ) + [ MonitoringThisProcess(HTopOfThisProcessFile, HTopTimeRes) ] + [ MonitoringAllKernelServers(HTopOfAllServersFile, HTopOfAllServersTimeRes) ] - - with AutoShutdown(proc,shutdown): - with contextlib.ExitStack() as stack: - for mgr in ctxManagers: - stack.enter_context(mgr) - executor.RunPy(proc,display,isPyThread=True,fromscratch=True) # same as RunW but releasing GIL - # - if dump_thread: - dump_thread.join() - # - if proc.getEffectiveState() != pilot.DONE: - raise RuntimeError( proc.getErrorReport() ) + if proc.getEffectiveState() != pilot.DONE: + raise RuntimeError( proc.getErrorReport() ) # if display > 0: proc.writeDotInFile("titi")