Структура данных рабочего пула - PullRequest
0 голосов
/ 08 ноября 2018

Мне интересно, есть ли в многопроцессорном модуле встроенная реализация, которая позволяла бы мне сохранять запущенные процессы в структуре на основе списка, и всякий раз, когда процесс завершается выполнением, он автоматически удаляется из списка.

В коде это будет выглядеть так:

from multiprocessing import process

pool = [] # This data structure needs to prune non-running processes

class A(Process):
     def run():
         pass

for i in range(0, 10):
    worker = A().start()
    pool.append(worker)


# So if I want to iterate the pool now, It should only contain the alive processes

Еще один способ справиться с этим - сохранить словарь:

pool = {
    processId: processObject
}

А затем получите идентификаторы активного процесса, используя psutil:

current_process = psutil.Process()
children = current_process.children(recursive=False)

Однако, каков будет размер объекта в словаре, когда процесс умрет?

1 Ответ

0 голосов
/ 09 ноября 2018

Я не думаю, что такая гипотетическая самообновляющаяся структура была бы хорошей идеей, по той же причине вам не следует изменять список, пока вы итерируете его. Процессы могут быть удалены во время итерации по пулу.

Чтобы безопасно выполнить итерацию, вам понадобится снимок, и это сделает бессмысленными все усилия такой структуры. Когда вам нужно обновить свой пул-лист, лучше сделать это явно, например:

pool[:] = [p for p in pool if p.is_alive()] # p are your processes

или если вы хотите, чтобы все активные дочерние процессы, а не только в вашем пользовательском пуле:

[p for p in multiprocessing.active_children()]

Конечно, вы можете поместить это где-нибудь в функцию или метод и вызывать его всякий раз, когда вам нужен фактический пул-лист. Процессы имеют атрибут pid, поэтому вам не понадобится psutil только для получения идентификаторов процессов.

...