- make readline() of child's stdout/stderr non-blocking
- process all available data at once
- add some sleep() between iterations
---
 createrepo/__init__.py |   27 ++++++++++++++++++---------
 1 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/createrepo/__init__.py b/createrepo/__init__.py
index d2e2039..d77f025 100644
--- a/createrepo/__init__.py
+++ b/createrepo/__init__.py
@@ -53,6 +53,15 @@ import deltarpms
 
 __version__ = '0.9.9'
 
+from select import select
+
+def _readlines(fd):
+    # non-blocking readline
+    while select([fd], [], [])[0]:
+        line = fd.readline()
+        if line == '': break
+        yield line
+
 
 class MetaDataConfig(object):
     def __init__(self):
@@ -658,18 +667,18 @@ class MetaDataGenerator:
                                         stderr=subprocess.PIPE)
                 worker_jobs[num] = job
             
-            gimmebreak = 0
-            while gimmebreak != len(worker_jobs.keys()):
-                gimmebreak = 0
+            while True:
+                gimmebreak = True
                 for (num,job) in worker_jobs.items():
-                    if job.poll() is not None:
-                        gimmebreak+=1
-                    line = job.stdout.readline()
-                    if line:
+                    if job.poll() is None:
+                        gimmebreak = False
+                    for line in _readlines(job.stdout):
                         self.callback.log('Worker %s: %s' % (num, 
line.rstrip()))
-                    line = job.stderr.readline()
-                    if line:
+                    for line in _readlines(job.stderr):
                         self.callback.errorlog('Worker %s: %s' % (num, 
line.rstrip()))
+                if gimmebreak:
+                    break
+                time.sleep(.1)
                     
             for (num, job) in worker_jobs.items():
                 if job.returncode != 0:
-- 
1.7.4.4

_______________________________________________
Yum-devel mailing list
[email protected]
http://lists.baseurl.org/mailman/listinfo/yum-devel

Reply via email to