The Gaudi Framework  v29r0 (ff2e7097)
GaudiMP.pTools.Syncer Class Reference
Inheritance diagram for GaudiMP.pTools.Syncer:
Collaboration diagram for GaudiMP.pTools.Syncer:

Public Member Functions

def __init__ (self, nWorkers, log, manyEvents=False, limit=None, step=None, firstEvent=None)
 
def syncAll (self, step="Not specified")
 
def syncAllRolling (self)
 
def processHang (self)
 
def checkAll (self)
 
def checkLastEvents (self)
 

Public Attributes

 limit
 
 step
 
 d
 
 manyEvents
 
 limitFirst
 
 keys
 
 nWorkers
 
 log
 

Detailed Description

Definition at line 588 of file pTools.py.

Constructor & Destructor Documentation

def GaudiMP.pTools.Syncer.__init__ (   self,
  nWorkers,
  log,
  manyEvents = False,
  limit = None,
  step = None,
  firstEvent = None 
)

Definition at line 590 of file pTools.py.

590  limit=None, step=None, firstEvent=None):
591  # Class to help synchronise the sub-processes
592  self.limit = limit
593  self.step = step
594  self.d = {}
595  self.manyEvents = manyEvents
596 
597  for i in xrange(-2, nWorkers):
598  self.d[i] = SyncMini(Event(), lastEvent=Event())
599  if self.manyEvents:
600  self.limitFirst = firstEvent
601 
602  self.keys = self.d.keys()
603  self.nWorkers = nWorkers
604  self.log = log
605 

Member Function Documentation

def GaudiMP.pTools.Syncer.checkAll (   self)

Definition at line 696 of file pTools.py.

696  def checkAll(self):
697  # Check the status of each Sync object
698  # return True or False
699  currentStatus = [mini.check() for mini in self.d.values()]
700  return all(currentStatus)
701 
def checkAll(self)
Definition: pTools.py:696
def GaudiMP.pTools.Syncer.checkLastEvents (   self)

Definition at line 702 of file pTools.py.

702  def checkLastEvents(self):
703  # check if all of the lastEvents are set to true in self.d[k][1]
704  stat = [sMini.checkLast() for sMini in self.d.values()]
705  return all(stat)
706 
707 # =========================== Methods =========================================
708 
709 
def checkLastEvents(self)
Definition: pTools.py:702
def GaudiMP.pTools.Syncer.processHang (   self)

Definition at line 690 of file pTools.py.

690  def processHang(self):
691  self.log.critical('Some proc is hanging during Event processing!')
692  for k in self.keys:
693  self.log.critical("Proc/Stat : %i / %s" % (k, self.d[k].check()))
694  return
695 
def processHang(self)
Definition: pTools.py:690
def GaudiMP.pTools.Syncer.syncAll (   self,
  step = "Not specified" 
)

Definition at line 606 of file pTools.py.

606  def syncAll(self, step="Not specified"):
607  # is it this method, or is it the rolling version needed?
608  # if so, drop through...
609 
610  if self.manyEvents:
611  sc = self.syncAllRolling()
612  return sc
613 
614  # Regular version ----------------------------
615  for i in xrange(0, self.limit, self.step):
616  if self.checkAll():
617  self.log.info('%s : All procs done @ %i s' % (step, i))
618  break
619  else:
620  time.sleep(self.step)
621 
622  # Now the time limit is up... check the status one final time
623  if self.checkAll():
624  self.log.info("All processes : %s ok." % (step))
625  return SUCCESS
626  else:
627  self.log.critical('Some process is hanging on : %s' % (step))
628  for k in self.keys:
629  hangString = "%s : Proc/Stat : %i/%s" % (
630  step, k, self.d[k].check())
631  self.log.critical(hangString)
632  return FAILURE
633 
def checkAll(self)
Definition: pTools.py:696
def syncAllRolling(self)
Definition: pTools.py:634
def syncAll(self, step="Not specified")
Definition: pTools.py:606
def GaudiMP.pTools.Syncer.syncAllRolling (   self)

Definition at line 634 of file pTools.py.

634  def syncAllRolling(self):
635  # Keep track of the progress of Event processing
636  # Each process syncs after each event, so keep clearing
637  # the sync Event, and re-checking
638  # Note the time between True checks too, if the time
639  # between events exceeds singleEvent, this is considered a hang
640 
641  # set the initial time
642  begin = time.time()
643  firstEv = {}
644  timers = {}
645  for k in self.keys:
646  self.d[k].reset()
647  firstEv[k] = False
648  timers[k] = 0.0
649 
650  active = self.keys
651  while True:
652  # check the status of each sync object
653  for k in active:
654  sMini = self.d[k]
655 
656  if sMini.check() or sMini.checkLast():
657  if sMini.checkLast() and sMini.check():
658  # if last Event set,then event loop finished
659  active.remove(k)
660  alive = time.time() - begin
661  self.log.info("Audit : Node %i alive for %5.2f"
662  % (k, alive))
663  else:
664  sMini.reset()
665  else:
666  # the event still has not been checked, how long is that?
667  # is it the first Event?
668  wait = time.time() - sMini.getTime()
669  cond = wait > self.limit
670  if not firstEv[k]:
671  cond = wait > self.limitFirst
672  firstEv[k] = True
673  if cond:
674  # It is hanging!
675  self.log.critical('Single event wait : %5.2f' % (wait))
676  self.processHang()
677  return FAILURE
678 
679  # Termination Criteria : if all procs have been removed, we're done
680  if self.checkLastEvents():
681  self.log.info('TC met for event loop')
682  break
683  else:
684  # sleep, loop again
685  time.sleep(self.step)
686 
687  self.log.info("All processes Completed all Events ok")
688  return SUCCESS
689 
def checkLastEvents(self)
Definition: pTools.py:702
def syncAllRolling(self)
Definition: pTools.py:634
def processHang(self)
Definition: pTools.py:690

Member Data Documentation

GaudiMP.pTools.Syncer.d

Definition at line 594 of file pTools.py.

GaudiMP.pTools.Syncer.keys

Definition at line 602 of file pTools.py.

GaudiMP.pTools.Syncer.limit

Definition at line 592 of file pTools.py.

GaudiMP.pTools.Syncer.limitFirst

Definition at line 600 of file pTools.py.

GaudiMP.pTools.Syncer.log

Definition at line 604 of file pTools.py.

GaudiMP.pTools.Syncer.manyEvents

Definition at line 595 of file pTools.py.

GaudiMP.pTools.Syncer.nWorkers

Definition at line 603 of file pTools.py.

GaudiMP.pTools.Syncer.step

Definition at line 593 of file pTools.py.


The documentation for this class was generated from the following file: