Salome HOME
[EDF29576] : make it better
authorAnthony Geay <anthony.geay@edf.fr>
Tue, 5 Mar 2024 17:07:30 +0000 (18:07 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Tue, 5 Mar 2024 17:07:30 +0000 (18:07 +0100)
src/yacsloader/driver_internal.py

index 4fa233d48a53ad2871bbed73927480e2c73a52dd..59f321ca6f0826955e57e43ebd2eeaa8586359fd 100644 (file)
@@ -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")