Belle II Software development
calculation_process.py
1
8import os
9from multiprocessing import Process, Pipe
10
11
12class 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_run = False
31
32
33 self.log_file_name = log_file_name
34
35
36 self.log_file_content = None
37
38
39 self.result_queue = result_queue
40
41
42 self.parameters = parameters
43
44
45 self.progress_queue_local, self.progress_queue_remote = Pipe()
46
47
48 self.is_valid = True
49
50 # Prepare the environment.
51 self.prepare()
52
53 # Call the constructor of the base class.
54 Process.__init__(self, target=self.start_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_content is None:
61 self.log_file_content = open(self.log_file_name).read()
62 os.unlink(self.log_file_name)
63 self.log_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_name).read()
72 else:
73 self.save_log()
74 return self.log_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_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_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.