34
34
import os
35
35
import sys
36
36
import tempfile
37
+ from multiprocessing import Pool , cpu_count
37
38
38
39
from filelock import Timeout , FileLock
39
40
52
53
print ("Need Python 3, you are running {}" .format (major_version ))
53
54
sys .exit (1 )
54
55
55
- __version__ = "0.7"
56
+ __version__ = "0.8"
57
+
58
+
59
+ def worker (args ):
60
+ project_name , logdir , loglevel , backupcount , config , incoming , uri , \
61
+ source_root , batch = args
62
+
63
+ if batch :
64
+ get_batch_logger (logdir , project_name ,
65
+ loglevel ,
66
+ backupcount ,
67
+ get_class_basename ())
68
+
69
+ return mirror_project (config , project_name ,
70
+ incoming ,
71
+ uri , source_root )
56
72
57
73
58
74
def main ():
@@ -77,6 +93,9 @@ def main():
77
93
parser .add_argument ('-I' , '--incoming' , action = 'store_true' ,
78
94
help = 'Check for incoming changes, terminate the '
79
95
'processing if not found.' )
96
+ parser .add_argument ('-w' , '--workers' , default = cpu_count (),
97
+ help = 'Number of worker processes' )
98
+
80
99
try :
81
100
args = parser .parse_args ()
82
101
except ValueError as e :
@@ -150,18 +169,22 @@ def main():
150
169
lock = FileLock (os .path .join (tempfile .gettempdir (), lockfile + ".lock" ))
151
170
try :
152
171
with lock .acquire (timeout = 0 ):
153
- for project_name in projects :
154
- if args .batch :
155
- get_batch_logger (logdir , project_name ,
156
- args .loglevel ,
157
- args .backupcount ,
158
- get_class_basename ())
159
-
160
- project_result = mirror_project (config , project_name ,
161
- args .incoming ,
162
- args .uri , source_root )
163
- if project_result == 1 :
164
- ret = 1
172
+ with Pool (processes = int (args .workers )) as pool :
173
+ worker_args = []
174
+ for x in projects :
175
+ worker_args .append ([x , logdir , args .loglevel ,
176
+ args .backupcount , config ,
177
+ args .incoming ,
178
+ args .uri , source_root ,
179
+ args .batch ])
180
+ print (worker_args )
181
+ try :
182
+ project_results = pool .map (worker , worker_args , 1 )
183
+ except KeyboardInterrupt :
184
+ sys .exit (1 )
185
+ else :
186
+ if any ([True for x in project_results if x == 1 ]):
187
+ ret = 1
165
188
except Timeout :
166
189
logger .warning ("Already running, exiting." )
167
190
sys .exit (1 )
0 commit comments