Mercurial > hg > config
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() |
