Author: eudoxos
Date: 2009-01-24 11:40:10 +0100 (Sat, 24 Jan 2009)
New Revision: 1638

Modified:
   trunk/gui/py/utils.py
   trunk/gui/py/yade-multi
Log:
1. Number lines in parameter table for multijobs from 1 (as text editors do)
2. Print short summary at the end of job log (when started, when finished, exit 
status, duration, commandline)


Modified: trunk/gui/py/utils.py
===================================================================
--- trunk/gui/py/utils.py       2009-01-24 05:55:23 UTC (rev 1637)
+++ trunk/gui/py/utils.py       2009-01-24 10:40:10 UTC (rev 1638)
@@ -295,7 +295,7 @@
                if not tableFileLine: tableFileLine=os.environ['PARAM_TABLE']
                tableFile,tableLine=tableFileLine.split(':')
                o.tags['line']='l'+tableLine
-               ll=[l.split('#')[0] for l in open(tableFile).readlines()]; 
names=ll[0].split(); values=ll[int(tableLine)].split()
+               ll=[l.split('#')[0] for l in ['']+open(tableFile).readlines()]; 
names=ll[1].split(); values=ll[int(tableLine)].split()
                assert(len(names)==len(values))
                for i in range(len(names)):
                        if names[i]=='description': 
o.tags['description']=values[i]

Modified: trunk/gui/py/yade-multi
===================================================================
--- trunk/gui/py/yade-multi     2009-01-24 05:55:23 UTC (rev 1637)
+++ trunk/gui/py/yade-multi     2009-01-24 10:40:10 UTC (rev 1638)
@@ -3,25 +3,44 @@
 #
 # portions © 2008 Václav Šmilauer <[email protected]>
 
+import os, sys, thread, time
 
+class JobInfo():
+       def __init__(self,num,id,command,log):
+               
self.started,self.finished,self.duration,self.exitStatus=None,None,None,None
+               self.command=command; self.num=num; self.log=log; self.id=id
+       def saveInfo(self):
+               log=file(self.log,'a')
+               log.write("""
+=================== JOB SUMMARY ================
+id      : %s
+status  : %d (%s)
+duration: %s
+command : %s
+started : %s
+finished: %s
+"""%(self.id,self.exitStatus,'OK' if self.exitStatus==0 else 
'FAILED',self.duration,self.command,time.asctime(time.localtime(self.started)),time.asctime(time.localtime(self.finished))));
+               log.close()
+
 #
 # _MANY_ thanks to Mark Pettit for concurrent jobs handling!
 # http://code.activestate.com/recipes/534160/
 #
 
-import os, sys, thread, time
 
 def __concurrent_batch(cmd,thread_num,completion_status_dict,exit_code_dict):
        """Helper routine for 'concurrent_batches."""
-
-       t0=time.time()
+       job=jobs[thread_num]
+       job.started=time.time();
        print '#%d started on %s'%(thread_num,time.asctime())
        exit_code_dict[thread_num] = os.system(cmd)
        completion_status_dict[thread_num] = 1  # for sum() routine
-       dt=int(time.time()-t0)
-       strDt='%02d:%02d:%02d'%(dt//3600,(dt%3600)//60,(dt%60))
-       strStatus='done   ' if exit_code_dict[thread_num]==0 else 'FAILED '
-       print "#%d %s (exit status %d), duration 
%s"%(thread_num,strStatus,exit_code_dict[thread_num],strDt)
+       job.finished=time.time(); dt=job.finished-job.started;
+       job.exitStatus=exit_code_dict[thread_num]
+       job.duration='%02d:%02d:%02d'%(dt//3600,(dt%3600)//60,(dt%60))
+       strStatus='done   ' if job.exitStatus==0 else 'FAILED '
+       print "#%d %s (exit status %d), duration %s, log 
%s"%(thread_num,strStatus,exit_code_dict[thread_num],job.duration,job.log)
+       job.saveInfo()
 
 def concurrent_batches(batchlist,maxjobs=0,maxtime=0):
        """Run a list of batch commands simultaneously.
@@ -104,8 +123,8 @@
 
 print "Will run `%s' on `%s' with nice value %d, output redirected to `%s', %d 
jobs at a time."%(executable,simul,nice,logFormat,maxJobs)
 
-ll=open(table,'r').readlines()
-availableLines=[i for i in range(len(ll)) if not 
re.match(r'^\s*(#.*)?$',ll[i][:-1]) and i>0]
+ll=['']+open(table,'r').readlines()
+availableLines=[i for i in range(len(ll)) if not 
re.match(r'^\s*(#.*)?$',ll[i][:-1]) and i>1]
 
 print "Will use table `%s', with available lines"%(table),', '.join([str(i) 
for i in availableLines])+'.'
 
@@ -120,13 +139,13 @@
        useLines0=numRange2List(lineList)
        for l in useLines0:
                if l not in availableLines: print "WARNING: skipping 
unavailable line %d that was requested from the command line."%l
-               elif l==0: print "WARNING: skipping line 0 that should contain 
variable labels"
+               elif l==1: print "WARNING: skipping line 1 that should contain 
variable labels"
                else: useLines+=[l]
 else: useLines=availableLines
 print "Will use lines ",', '.join([str(i) for i in useLines])+'.'
 # find column where description is
 try:
-       idColumn=ll[0].split().index('description')
+       idColumn=ll[1].split().index('description')
        idStrings={}
        for i in useLines: idStrings[i]=ll[i].split()[idColumn] # textual 
descripion of respective lines 
        print idStrings
@@ -135,14 +154,15 @@
        idStrings=None
 
 
-batches=[]
-for l in useLines:
+jobs=[]
+for i,l in enumerate(useLines):
        logFile=logFormat.replace('%',str(l))
        if idStrings: logFile=logFile.replace('@',idStrings[l])
-       batches.append('PARAM_TABLE=%s:%d nice -n %d %s -N PythonUI -- -n -x %s 
> %s 2>&1'%(table,l,nice,executable,simul,logFile))
+       jobs.append(JobInfo(i,idStrings[l] if idStrings else 
'#'+str(i),'PARAM_TABLE=%s:%d nice -n %d %s -N PythonUI -- -n -x %s > %s 
2>&1'%(table,l,nice,executable,simul,logFile),logFile))
+
 print "Job summary:"
-for i in range(len(batches)):
-       print '   #%d:'%i, batches[i]
+for job in jobs:
+       print '   #%d (%s):'%(job.num,job.id),job.command
 # OK, go now
-concurrent_batches(batches,maxjobs=maxJobs)
+concurrent_batches([job.command for job in jobs],maxjobs=maxJobs)
 print 'All jobs finished, bye.'


_______________________________________________
Mailing list: https://launchpad.net/~yade-dev
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yade-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to