-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparallel_read_test.py
122 lines (96 loc) · 3.06 KB
/
parallel_read_test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Starts process and reads its stdou and stderr.
# Not in background: run_cmd blocks untill command has not exited.
#
import os
import sys
from subprocess import Popen, PIPE
from threading import Thread
from select import select
from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
#
TIMEOUT = 5
BUFSIZE = 0 # unbuffered
LOG_BUFSIZE = 256
def progress(proc, timeout=TIMEOUT):
running = True
outs = [proc.stdout, proc.stderr]
nouts = len(outs)
max_count = LOG_BUFSIZE
prev_out = None
out = None
count = 0
nclosed = 0
print('monitoring thread started.')
while running:
try:
(ready_outs, x0, x1) = select(outs, [], [], timeout)
n = len(ready_outs)
if prev_out:
if prev_out in ready_outs:
if count < max_count:
out = prev_out
count += 1
else:
if n > 1:
i = ready_outs.index(prev_out)
if i < n - 1:
out = ready_outs[i+1]
else:
out = ready_outs[0]
count = 0
else:
out = prev_out
elif n > 0:
out = ready_outs[0]
count = 0
else:
out = None
elif n > 0:
out = ready_outs[0]
count = 0
else:
out = None
prev_out = out
if out:
dat = out.read(1)
if dat:
sys.stdout.write(dat)
else:
outs.remove(out)
nclosed += 1
if nclosed >= nouts:
running = False
except BaseException, e:
print(str(e))
break
proc.wait()
if proc.returncode > 0:
print('execution failed: %s' % proc.returncode)
def run_cmd(cmd):
cmd_path = os.path.abspath(cmd)
print('cmd="%s"' % cmd_path)
try:
proc = Popen(cmd_path, bufsize=BUFSIZE, shell=True,
stdout=PIPE, stderr=PIPE, close_fds=True,
universal_newlines=True)
th = Thread(target=progress, args=(proc,))
th.start()
th.join()
except (KeyboardInterrupt, SystemExit):
print('interrupted.')
except OSError, e:
print('execution failed: %s' % e)
def main():
# parser = ArgumentParser(description='Process monitor',
# formatter_class=ArgumentDefaultsHelpFormatter)
# parser.add_argument('cmd', type=str, metavar='PATH',
# help='command to be monitored')
# args = parser.parse_args()
commands = ["./mlframe/scripts/test.sh A","./mlframe/scripts/test.sh B"]
for cmd in commands:
run_cmd(cmd)
print "finished"
if __name__ == '__main__':
main()