So erhalten Sie die einzelnen Prozess-IDs bei der Mehrfachverarbeitung

Ich habe einige Probleme, weil ich Neuling in Python und Pyside bin.

Ich habe N Prozesse, die gleichzeitig ausgeführt werden.

Da es einige Zeit dauert, bis diese Prozesse abgeschlossen sind, möchte der Endbenutzer möglicherweise einen bestimmten Prozess abbrechen. Daher muss ich die IDs der Prozesse kennen, mit denen diese Funktion zum Programm hinzugefügt werden kann.

Da ist einAntworten in Stackoverflow ist genau das, was ich tue.

Hier ist der Code:

#!/usr/bin/env python3
import multiprocessing, multiprocessing.pool, time, random, sys
from PySide.QtCore import *
from PySide.QtGui import *

def compute(num_row):
    print("worker started at %d" % num_row)
    random_number = random.randint(1, 10)
    for second in range(random_number):
        progress = float(second) / float(random_number) * 100
        compute.queue.put((num_row, progress,))
        time.sleep(1)
    compute.queue.put((num_row, 100))

def pool_init(queue):
    # see https://stackoverflow.com/a/3843313/852994
    compute.queue = queue

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.toolBar = self.addToolBar("Toolbar")
        self.toolBar.addAction(QAction('Add Task', self, triggered=self.addTask))
        self.table = QTableWidget()
        self.table.verticalHeader().hide()
        self.table.setColumnCount(2)
        self.setCentralWidget(self.table)

        # Pool of Background Processes
        self.queue = multiprocessing.Queue()
        self.pool = multiprocessing.Pool(processes=4, initializer=pool_init, initargs=(self.queue,))
        # Check for progress periodically
        self.timer = QTimer()
        self.timer.timeout.connect(self.updateProgress)
        self.timer.start(2000)

    def addTask(self):
        num_row = self.table.rowCount()
        self.pool.apply_async(func=compute, args=(num_row,))
        label = QLabel("Queued")
        bar = QProgressBar()
        bar.setValue(0)
        self.table.setRowCount(num_row + 1)
        self.table.setCellWidget(num_row, 0, label)
        self.table.setCellWidget(num_row, 1, bar)

    def updateProgress(self):
        if self.queue.empty(): return
        num_row, progress = self.queue.get() # unpack
        print("received progress of %s at %s" % (progress, num_row))
        label = self.table.cellWidget(num_row, 0)
        bar = self.table.cellWidget(num_row, 1)
        bar.setValue(progress)
        if progress == 100:
            label.setText('Finished')
        elif label.text() == 'Queued':
            label.setText('Downloading')
        self.updateProgress() # recursion

if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

Ich habe eine Schaltfläche "Stopp" hinzugefügt und weiß, wie die ausgewählte Zeile in der Tabelle abgerufen wird, aber ich weiß nicht, wie die Prozess-ID der ausgewählten Zeile zum Beenden abgerufen wird.

Update 1 :

Um dies zu vereinfachen, kann ich mich ändern

multiprocessing.Pool(processes=4, initializer=pool_init, initargs=(self.queue,)) zu

multiprocessing.Pool(processes=1, initializer=pool_init, initargs=(self.queue,))

Auf diese Weise müssen alle Prozesse warten, bis ein Prozess abgeschlossen ist

Jetzt läuft ein Prozess und andere befinden sich in der Warteschlange. Wie kann ich nur die Prozess-ID dieses laufenden Prozesses ermitteln?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage