- 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