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?