def stop_visualization(app, visualizerFile, optOnly=False): """ Clean visualization tasks from the visualizerFile It basically terminates all the running/pending tasks from the visualizerFile When optOnly==True, if only terminates the running/pending tasks that was started from plot options changing requests NOTE: error should be handled by the caller @type app: Celery application @param app: Celery application instance @type visualizerFile: string @param visualizerFile: name of the visualizationStatus file that stores the visualization manager/task id's and its updated status @type optOnly: bool @param optOnly: flag indicating whether only terminates the running/pending tasks that was started from plot options changing requests """ # return if visualizerFile has been generated yet if not os.path.isfile(visualizerFile): return # extract previously saved visualization status visualizationManager_preState = {} visualizationTask_preState = {} pattern_visMgr = re.compile( r"Visualization manager \(id: ([^\s]+), options: (.+)\) status: ([A-Z]+)\n" ) pattern_visTsk = re.compile( r"Visualization task \(id: ([^\s]+), options: (.+), file: ([^\s]+)\) status: ([A-Z]+)\n" ) for line in open(visualizerFile).readlines(): if pattern_visMgr.match(line): (mid, moptions, mstate) = pattern_visMgr.match(line).groups() visualizationManager_preState[mid] = (mstate, moptions) if pattern_visTsk.match(line): (tid, toptions, tfile, tstate) = pattern_visTsk.match(line).groups() visualizationTask_preState[tid] = (tstate, tfile) # if the visualizationManager was not found if not visualizationManager_preState: # raise an exception because this should never happend raise RuntimeError # for each visualization manager (with or without options) for mid, (mstate, moptions) in visualizationManager_preState.items(): # skip visualization for None options when requested if optOnly and moptions == 'None': continue # get the current visualization manager status visMgr_state = AsyncResult(mid).state # collect the current visualization task information when necessary visualizationTask_info = {} if visMgr_state in ['PROGRESS', 'SUCCESS']: visualizationTask_info = AsyncResult(mid).result # kill the visualization manager if possible if visMgr_state in ['PENDING', 'STARTED', 'PROGRESS']: revoke(mid, terminate=True) # kill the visualization tasks if any for (visualizationTask_id, plotManifestFileName) in visualizationTask_info.iteritems(): visTsk_state = AsyncResult(visualizationTask_id).state if visTsk_state in ['PENDING', 'STARTED']: revoke(visualizationTask_id, terminate=True)
def update_visualization(app, visualizerFile): """ Update the visualizerFile and the plot menifest file when a visualization task is done NOTE: error should be handled by the caller @type app: Celery application @param app: Celery application instance @type visualizerFile: string @param visualizerFile: name of the visualizationStatus file that stores the visualization manager/task id's and its updated status """ # return if visualizerFile has been generated yet if not os.path.isfile(visualizerFile): return # extract previously saved visualization status and update times information visualizationManager_preState = {} visualizationTask_preState = {} updateTimes = None pattern_visMgr = re.compile( r"Visualization manager \(id: ([^\s]+), options: (.+)\) status: ([A-Z]+)\n" ) pattern_visTsk = re.compile( r"Visualization task \(id: ([^\s]+), options: (.+), file: ([^\s]+)\) status: ([A-Z]+)\n" ) pattern_updateTimes = re.compile(r"Update times: ([0-9]+)\n") for line in open(visualizerFile).readlines(): if pattern_visMgr.match(line): (mid, moptions, mstate) = pattern_visMgr.match(line).groups() visualizationManager_preState[mid] = (mstate, moptions) if pattern_visTsk.match(line): (tid, toptions, tfile, tstate) = pattern_visTsk.match(line).groups() visualizationTask_preState[tid] = (tstate, tfile) if pattern_updateTimes.match(line): updateTimes = pattern_updateTimes.match(line).groups()[0] updateTimes = locale.atoi(updateTimes) # if the visualizationManager was not found if not visualizationManager_preState or updateTimes is None: # raise an exception because this should never happend raise RuntimeError # clear the visualization status file open(visualizerFile, 'w').close() fout = open(visualizerFile, 'a') # for each visualization manager (with or without options) for mid, (mstate, moptions) in visualizationManager_preState.items(): # get the visualizationManger state visMgr_asyncResult = AsyncResult(mid) visMgr_result = visMgr_asyncResult.result if isinstance(visMgr_result, collections.Iterable) and 'state' in visMgr_result: visMgr_state = visMgr_result['state'] else: visMgr_state = visMgr_asyncResult.state # save the visualization manager status in visualizationStatus file fout.write("Visualization manager (id: %s, options: %s) status: %s\n" % (mid, moptions, visMgr_state)) # if the visualization manager is pending, failed, or timeout # or the visualization manager is an unkown status other than finishd or in progress if visMgr_state in [ 'PENDING', 'FAILURE', 'RETRY', 'REVOKED', 'TIMEOUT', 'ALREADYRUNNING' ] or visMgr_state not in ['PROGRESS', 'SUCCESS']: # break, because there will be no further update for visualization status break # collect the current visualization task information visualizationTask_info = AsyncResult(mid).result # update the plot menifest files for the completed visualization tasks session_dir = os.path.dirname(visualizerFile) # loop over the submitted visualization tasks for (visualizationTask_id, plotManifestFileName) in visualizationTask_info.iteritems(): # get the visualizationTask task state and internal result visTsk_state, visTsk_internal_result = None, None visTsk_asyncResult = AsyncResult(visualizationTask_id) visTsk_result = visTsk_asyncResult.result if isinstance(visTsk_result, collections.Iterable) and 'state' in visTsk_result: visTsk_state = visTsk_result['state'] if 'result' in visTsk_result: visTsk_internal_result = visTsk_result['result'] else: visTsk_state = visTsk_asyncResult.state # if this visualization task was not previously submitted # and it succeeded and returned internal result (plotManifestFileName, plotManifestFile_content) if visualizationTask_id not in visualizationTask_preState and visTsk_state == 'SUCCESS' and visTsk_internal_result: # save the plot menifest file (plotManifestFileName, plotManifestFile_content) = visTsk_internal_result plotManifestFile = os.path.join(session_dir, plotManifestFileName) if (not os.path.isfile(plotManifestFile)): open(plotManifestFile, 'w').write(plotManifestFile_content) # save this visualization task status in visualizationStatus file fout.write( "Visualization task (id: %s, options: %s, file: %s) status: %s\n" % (visualizationTask_id, moptions, plotManifestFileName, visTsk_state)) # save the update times information fout.write("Update times: %s\n" % (updateTimes + 1)) # close visualization state file fout.close()