对于参考,这里是我目前使用Pyside的实现。 我希望能够捕获每个进程的输出并将其传递(例如用于显示QTextEdit
或类似内容)。为此,我为每个进程分配一个数字,并将它的stdout和stderr连接到插槽,然后发送消息和进程位置。 我不是我目前执行的该功能所折服,但在这里有云:
class ProcessRunner(QtCore.QObject):
'''
Runs N processes in groups of M
'''
singleProcessFinished = QtCore.Signal()
error = QtCore.Signal(tuple) #(process number, message)
message = QtCore.Signal(tuple) #(process number, message)
def __init__(self, maxProcesses=4, parent=None):
super(ProcessRunner, self).__init__(parent)
self.processQueue = Queue.Queue()
self.maxProcesses = maxProcesses
self.activeProcessCount = 0
self._processNumber = 0
def addProcess(self, program, args):
'''
Add a process to the process queue
Args:
program (str): String of program path and arguments, separated by one or more spaces
'''
self._processNumber += 1
if self._processNumber == self.maxProcesses:
self._processNumber = 0
proc = QtCore.QProcess(self)
proc.readyReadStandardError.connect(lambda pos=self._processNumber, process=proc: self.emit_error(pos, proc))
proc.readyReadStandardOutput.connect(lambda pos=self._processNumber, process=proc: self.emit_output(pos, proc))
self.processQueue.put((proc, program, args))
self.startFreeProcesses()
def startFreeProcesses(self):
'''
Starts all waiting processes up to a maximum of self.maxProcesses
'''
while (not self.processQueue.empty()) and (self.activeProcessCount < self.maxProcesses):
proc, program, args = self.processQueue.get()
proc.finished.connect(self.startFreeProcesses)
proc.finished.connect(proc.deleteLater)
proc.finished.connect(self.singleProcessFinished.emit)
proc.finished.connect(self._decreaseActiveProcessCount)
proc.start(program, args)
proc.waitForStarted(-1)
self._increaseActiveProcessCount()
def _decreaseActiveProcessCount(self):
self.activeProcessCount -= 1
def _increaseActiveProcessCount(self):
self.activeProcessCount += 1
def emit_error(self, pos, proc):
self.error.emit(pos, str(proc.readAllStandardError()))
def emit_error(self, pos, proc):
self.error.emit(pos, str(proc.readAllStandardOutput()))
,这看起来像一个非常良好的开端。我们如何知道所有流程何时完成? 我想在调用函数中,你可以把'while(process_runner.getActiveProcessCount()> 0)类似的东西继续下去... ...会是最好的吗? – jramm
您可以在startFreeProcesses中检入getActiveProcessCount等于零。每一个,完成后,你将chech已经完成所有的过程。 – Milovidov
'm_processCount'应该重命名为'm_maxAsyncProcessCount',或类似的东西。除此之外,看起来不错,并且完成了工作! – phyatt