我有剧本(工人.py)在表单中打印无缓冲的输出。。。在1
2
3
.
.
.
n
其中n是此脚本中的循环将进行的某个固定的迭代次数。在另一个脚本中(服务_控制器.py)我启动多个线程,每个线程都使用子流程.Popen(标准输出=子流程.管道,…);现在,在我的主线程(服务_控制器.py)我想读取每个线程的工人.py子流程,并使用它计算完成前剩余时间的估计。在
我有从中读取标准输出的所有逻辑工人.py并确定最后打印的数字。问题是我不知道如何以非阻塞的方式来实现这一点。如果我读取一个常量bufsize,那么每次读取都将等待来自每个worker的相同数据。我尝试了很多方法,包括使用fcntl、select+操作系统读取等等。我最好的选择是什么?如果需要的话,我可以发布我的来源,但是我认为这个解释很好地描述了这个问题。在
谢谢你的帮助。在
编辑
添加示例代码
我有一个启动子进程的worker。在
^{pr2}$
然后我有一个线程管理器。在class ThreadManager():
def __init__(self):
self.pool = []
self.running = []
self.lock = threading.Lock()
def clean_pool(self, pool):
for worker in [x for x in pool is not x.isAlive()]:
worker.join()
pool.remove(worker)
del worker
return pool
def run(self, concurrent=5):
while len(self.running) + len(self.pool) > 0:
self.clean_pool(self.running)
n = min(max(concurrent - len(self.running), 0), len(self.pool))
if n > 0:
for worker in self.pool[0:n]:
worker.start()
self.running.extend(self.pool[0:n])
del self.pool[0:n]
time.sleep(.01)
for worker in self.running + self.pool:
worker.join()
和一些运行它的代码。在threadManager = ThreadManager()
for i in xrange(0, 5):
threadManager.pool.append(WorkerThread())
threadManager.run()
我删除了其他代码的日志,希望能找出问题所在。在