comparison python/multiproc.py @ 614:f905378fcee0

STUB: python/multiproc.py
author Jeff Hammel <k0scist@gmail.com>
date Sun, 02 Feb 2014 18:25:15 -0800
parents bf3f8bc6d1b3
children 6db42d965f0e
comparison
equal deleted inserted replaced
613:bf3f8bc6d1b3 614:f905378fcee0
50 """internal function to finalize""" 50 """internal function to finalize"""
51 51
52 # read final output 52 # read final output
53 self.read(process_output) 53 self.read(process_output)
54 54
55 # reset output buffer 55 # reset output buffer location
56 self.output_buffer.seek(0) 56 self.output_buffer.seek(0)
57 57
58 # set end time 58 # set end time
59 self.end = time.time() 59 self.end = time.time()
60 60
61 def poll(self): 61 def poll(self, process_output=None):
62 return subprocess.Popen.poll(self) 62
63 if process_output is not None:
64 self.read(process_output) # read from output buffer
65 poll = subprocess.Popen.poll(self)
66 if poll is not None:
67 self._finalize(process_output)
68 return poll
63 69
64 def wait(self, maxtime=None, sleep=1., process_output=None): 70 def wait(self, maxtime=None, sleep=1., process_output=None):
65 """ 71 """
66 maxtime -- timeout in seconds 72 maxtime -- timeout in seconds
67 sleep -- number of seconds to sleep between polling 73 sleep -- number of seconds to sleep between polling
68 """ 74 """
69 while self.poll() is None: 75 while self.poll(process_output) is None:
70 76
71 # check for timeout 77 # check for timeout
72 curr_time = time.time() 78 curr_time = time.time()
73 run_time = self.runtime() 79 run_time = self.runtime()
74 if maxtime is not None and run_time > maxtime: 80 if maxtime is not None and run_time > maxtime:
75 self.kill() 81 self.kill()
76 self._finalize(process_output) 82 self._finalize(process_output)
77 return 83 return
78
79 # read from output buffer
80 self.read(process_output)
81 84
82 # naptime 85 # naptime
83 if sleep: 86 if sleep:
84 time.sleep(sleep) 87 time.sleep(sleep)
85 88
126 129
127 # parse command line 130 # parse command line
128 parser = argparse.ArgumentParser(description=__doc__) 131 parser = argparse.ArgumentParser(description=__doc__)
129 parser.add_argument("-t", "--time", dest="time", 132 parser.add_argument("-t", "--time", dest="time",
130 type=float, default=4., 133 type=float, default=4.,
131 help="seconds to run for") 134 help="seconds to run for (or <= 0 for forever)")
132 parser.add_argument("-s", "--sleep", dest="sleep", 135 parser.add_argument("-s", "--sleep", dest="sleep",
133 type=float, default=1., 136 type=float, default=1.,
134 help="sleep this number of seconds between polling") 137 help="sleep this number of seconds between polling")
135 parser.add_argument("-p", "--prog", dest='program', 138 parser.add_argument("-p", "--prog", dest='program',
136 choices=progs.keys(), default='ping', 139 choices=progs.keys(), default='ping',
152 # start process 155 # start process
153 proc = Process(prog) 156 proc = Process(prog)
154 157
155 # callback for output processing 158 # callback for output processing
156 def process_output(output): 159 def process_output(output):
157 print ('[{}] {}\n{}'.format(proc.runtime(), 160 print ('[{}] {}{}'.format(proc.runtime(),
158 output.upper(), 161 output.upper(),
159 '-==-'*10)) 162 '-==-'*10))
160 163
164 # start the main subprocess loop
165 while proc.poll(process_output) is None:
161 166
162 # LEGACY: output = tempfile.SpooledTemporaryFile() 167 if options.time > 0 and proc.runtime() > options.time:
163 # start = time.time() 168 proc.kill()
164 # proc = subprocess.Popen(prog, stdout=output)
165 # location = 0
166 169
167 # start the main subprocess loop 170 if options.sleep:
168 # while proc.poll() is None: 171 time.sleep(options.sleep)
169
170 # LEGACY:
171 # curr_time = time.time()
172 # run_time = curr_time - start
173 # if run_time > options.time:
174 # proc.kill()
175
176
177 # output.seek(location)
178 # read = output.read()
179 # location += len(read)
180 # print ('[{}] {}\n{}'.format(run_time, read, '-==-'*10))
181 # if options.sleep:
182 # time.sleep(options.sleep)
183
184 # # reset tempfile
185 # output.seek(0)
186 172
187 # wait for being done 173 # wait for being done
188 proc.wait(maxtime=options.time, sleep=options.sleep, process_output=process_output) 174 #proc.wait(maxtime=options.time, sleep=options.sleep, process_output=process_output)
189 175
190 # finalization 176 # correctness tests
177 assert proc.end is not None
178
179 # print summary
191 output = proc.output 180 output = proc.output
192 n_lines = len(output.splitlines()) 181 n_lines = len(output.splitlines())
193 print ("{}: {} lines".format(subprocess.list2cmdline(prog), n_lines)) 182 print ("{}: {} lines".format(subprocess.list2cmdline(prog), n_lines))
194 183
195 if __name__ == '__main__': 184 if __name__ == '__main__':