comparison python/multiproc.py @ 615:6db42d965f0e

STUB: python/multiproc.py
author Jeff Hammel <k0scist@gmail.com>
date Sun, 02 Feb 2014 18:44:05 -0800
parents f905378fcee0
children 41133baea90d
comparison
equal deleted inserted replaced
614:f905378fcee0 615:6db42d965f0e
121 121
122 122
123 def main(args=sys.argv[1:]): 123 def main(args=sys.argv[1:]):
124 """CLI""" 124 """CLI"""
125 125
126 description = """demonstration of how to do things with subprocess"""
127
126 # available programs 128 # available programs
127 progs = {'yes': ["yes"], 129 progs = {'yes': ["yes"],
128 'ping': ['ping', 'google.com']} 130 'ping': ['ping', 'google.com']}
129 131
130 # parse command line 132 # parse command line
131 parser = argparse.ArgumentParser(description=__doc__) 133 parser = argparse.ArgumentParser(description=description)
132 parser.add_argument("-t", "--time", dest="time", 134 parser.add_argument("-t", "--time", dest="time",
133 type=float, default=4., 135 type=float, default=4.,
134 help="seconds to run for (or <= 0 for forever)") 136 help="seconds to run for (or <= 0 for forever)")
135 parser.add_argument("-s", "--sleep", dest="sleep", 137 parser.add_argument("-s", "--sleep", dest="sleep",
136 type=float, default=1., 138 type=float, default=1.,
139 choices=progs.keys(), default='ping', 141 choices=progs.keys(), default='ping',
140 help="subprocess to run") 142 help="subprocess to run")
141 parser.add_argument("--list-programs", dest='list_programs', 143 parser.add_argument("--list-programs", dest='list_programs',
142 action='store_true', default=False, 144 action='store_true', default=False,
143 help="list available programs") 145 help="list available programs")
146 parser.add_argument("--wait", dest='wait',
147 action='store_true', default=False,
148 help="run with ``.wait()`` and a callback")
149 parser.add_argument("--callback", dest='callback',
150 action='store_true', default=False,
151 help="run with polling and a callback")
144 options = parser.parse_args(args) 152 options = parser.parse_args(args)
145 153
146 # list programs 154 # list programs
147 if options.list_programs: 155 if options.list_programs:
148 for key in sorted(progs.keys()): 156 for key in sorted(progs.keys()):
153 prog = progs[options.program] 161 prog = progs[options.program]
154 162
155 # start process 163 # start process
156 proc = Process(prog) 164 proc = Process(prog)
157 165
158 # callback for output processing 166 # demo function for processing output
159 def process_output(output): 167 def output_processor(output):
160 print ('[{}] {}{}'.format(proc.runtime(), 168 print ('[{}]:\n{}\n{}'.format(proc.runtime(),
161 output.upper(), 169 output.upper(),
162 '-==-'*10)) 170 '-==-'*10))
163 171 if options.callback:
164 # start the main subprocess loop 172 process_output = output_processor
165 while proc.poll(process_output) is None: 173 else:
166 174 process_output = None
167 if options.time > 0 and proc.runtime() > options.time: 175
168 proc.kill() 176 if options.wait:
169 177 # wait for being done
170 if options.sleep: 178 proc.wait(maxtime=options.time, sleep=options.sleep, process_output=output_processor)
171 time.sleep(options.sleep) 179 else:
172 180 # start the main subprocess loop
173 # wait for being done 181 while proc.poll(process_output) is None:
174 #proc.wait(maxtime=options.time, sleep=options.sleep, process_output=process_output) 182
183 if options.time > 0 and proc.runtime() > options.time:
184 proc.kill()
185
186 if options.sleep:
187 time.sleep(options.sleep)
188
189 if process_output is not None:
190 # process the output with ``.read()`` call
191 proc.read(output_processor)
175 192
176 # correctness tests 193 # correctness tests
177 assert proc.end is not None 194 assert proc.end is not None
178 195
179 # print summary 196 # print summary
180 output = proc.output 197 output = proc.output
181 n_lines = len(output.splitlines()) 198 n_lines = len(output.splitlines())
182 print ("{}: {} lines".format(subprocess.list2cmdline(prog), n_lines)) 199 print ("{}: {} lines, ran for {} seconds".format(subprocess.list2cmdline(prog), n_lines, proc.runtime()))
183 200
184 if __name__ == '__main__': 201 if __name__ == '__main__':
185 main() 202 main()