Belle II Software  release-08-01-10
calculation_process.py
1 
8 import os
9 from multiprocessing import Process, Pipe
10 
11 
12 class CalculationProcess(Process):
13  """
14  Abstract base class for doing the real processing of a calculation. Is used by the handler to
15  process the calculation you requested. Overload the start_process and prepare method to implement your calculation
16  and maybe also the __init__ method if you need to store more information on your process (like what to calculate).
17 
18  See ipython_handler_basf2/calculation_process.py for an example implementation.
19  """
20 
21  def __init__(self, result_queue, log_file_name, parameters):
22  """
23  Create a new calculation process instance. The parameters here are the absolute standard. You probably have to redefine the
24  constructor in your own class.
25  """
26  if result_queue is None:
27  raise ValueError("Invalid result_queue")
28 
29 
30  self.already_runalready_run = False
31 
32 
33  self.log_file_namelog_file_name = log_file_name
34 
35 
36  self.log_file_contentlog_file_content = None
37 
38 
39  self.result_queueresult_queue = result_queue
40 
41 
42  self.parametersparameters = parameters
43 
44 
45  self.progress_queue_local, self.progress_queue_remoteprogress_queue_remote = Pipe()
46 
47 
48  self.is_validis_valid = True
49 
50  # Prepare the environment.
51  self.prepareprepare()
52 
53  # Call the constructor of the base class.
54  Process.__init__(self, target=self.start_processstart_process)
55 
56  def save_log(self):
57  """
58  Delete the log file and copy its content to the class.
59  """
60  if self.log_file_contentlog_file_content is None:
61  self.log_file_contentlog_file_content = open(self.log_file_namelog_file_name).read()
62  os.unlink(self.log_file_namelog_file_name)
63  self.log_file_namelog_file_name = None
64 
65  def get_log(self):
66  """
67  Return the log file content.
68  Use the methods of the Calculation for a better handling.
69  """
70  if self.is_alive():
71  return open(self.log_file_namelog_file_name).read()
72  else:
73  self.save_logsave_log()
74  return self.log_file_contentlog_file_content
75 
76  def get(self, name):
77  """
78  Return an item from the result queue. Only gives a result if the calculation has finished.
79  Use the Calculation for a better handling.
80  """
81  if not self.is_alive():
82  return self.result_queueresult_queue.get(name)
83 
84  def get_keys(self):
85  """
86  Return the names of all item from the result queue. Only gives a result if the calculation has finished.
87  Use the Calculation for a better handling.
88  """
89  if not self.is_alive():
90  return self.result_queueresult_queue.get_keys()
91 
92  def start_process(self):
93  """
94  The function given to the process to start the calculation.
95  Do not call by yourself.
96  Resets the logging system, logs onto console and a file and sets the queues
97  (the result queue and the process queue) correctly.
98  """
99 
100  def prepare(self):
101  """
102  Overload this function if you need to process some preparations
103  before doing the real calculation.
104  """
progress_queue_remote
Create the queue for the progress python module.
def __init__(self, result_queue, log_file_name, parameters)
is_valid
Set to false, if you do not want this process to show up in the process bar calculations.