Jak uzyskać każdy identyfikator procesu podczas przetwarzania wieloprocesorowego

Mam pewne problemy, ponieważ jestem nowicjuszem w Pythonie i Pyside.

Mam N procesów, które działają jednocześnie.

Ponieważ zakończenie tych procesów zajmuje trochę czasu, możliwe, że użytkownik końcowy chce anulować określony proces. Potrzebuję więc sposobu poznania identyfikatorów procesów dodawania tej funkcji do programu.

Tam jestodpowiedź w Stackoverflow, co jest dokładnie tym, co robię.

Oto kod:

#!/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_())

Dodałem przycisk „stop” i wiem, jak uzyskać wybrany wiersz w tabeli, ale nie wiem, jak uzyskać identyfikator procesu wybranego wiersza do zakończenia.

aktualizacja 1 :

bo ułatwiam to mogę zmienić

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

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

w ten sposób wszystkie procesy muszą czekać na zakończenie procesu

teraz mamy uruchomiony jeden proces, a inne są w kolejce. Jak mogę uzyskać tylko identyfikator procesu tego uruchomionego procesu?

questionAnswers(2)

yourAnswerToTheQuestion