Сообщить об ошибке.

Получение сведений о процессах, модуль multiprocessing в Python

Функции модуля, для получения сведений о запущенных процессах

В разделе рассмотрены функции модуля multiprocessing, при помощи которых можно узнать различные сведения о рабочих процессах, запущенных из программы.

Содержание:


multiprocessing.active_children():

Функция multiprocessing.active_children() возвращает список всех живых дочерних элементов текущего процесса.

Вызов функции этого имеет побочный эффект - "присоединение" (.join) к уже завершенным процессам.

multiprocessing.cpu_count():

Функция multiprocessing.cpu_count() возвращает количество имеющихся ядер процессора на машине/сервере.

Возвращаемое число не эквивалентно числу ядер, которые может использовать текущий процесс, т.к. некоторые ядра могут быть заняты другими процессами. Количество ядер, которое может использовать текущий процесс можно получить при помощи вызова len(os.sched_getaffinity(0).)

Вызов функции multiprocessing.cpu_count() может вызывать исключение NotImplementedError.

Смотрите также функцию os.cpu_count().

>>> import multiprocessing
>>> multiprocessing.cpu_count()
# 6

>>> import os
>>> os.cpu_count()
# 6

# при вызове, не было запущено ни 
# одного процесса, по этому доступны 
# для использования все ядра сервера
>>> os.sched_getaffinity(0)
{0, 1, 2, 3, 4, 5}

multiprocessing.current_process():

Функция multiprocessing.current_process() возвращает объект Process, соответствующий текущему процессу.

Аналог функции threading.current_thread() модуля threading.

import multiprocessing

def worker(x):
    # использование `multiprocessing.current_process()`
    # на примере получения имени текущего процесса
    name_proc = multiprocessing.current_process().name
    res = x*x
    print(name_proc, res)
    return res

data = range(3, 7)

with multiprocessing.Pool(2) as pool:
    print(pool.map(worker, data))
    
# ForkPoolWorker-1 9 
# ForkPoolWorker-2 16
# ForkPoolWorker-1 25
# ForkPoolWorker-1 36
# [9, 16, 25, 36]

multiprocessing.parent_process():

Функция multiprocessing.parent_process() возвращает объект Process, соответствующий родительскому процессу multiprocessing.current_process().

Для основного процесса multiprocessing.parent_process() возвращает None.

Новое в Python 3.8.

multiprocessing.freeze_support():

Функция multiprocessing.freeze_support() добавляет поддержку, если программа использующая модуль multiprocessing была заморожена для создания исполняемого файла Windows. Протестирована с модулями py2exe, PyInstaller и cx_Freeze.

Вызов функции нужно добавлять сразу после строки if __name__ == '__main__' основного модуля. Например:

import multiprocessing

def worker():
    print('hello world!')

if __name__ == '__main__':
    multiprocessing.freeze_support()
    multiprocessing.Process(target=worker).start()

Если строка freeze_support() опущена, то попытка запустить замороженный исполняемый файл вызовет RuntimeError.

Вызов multiprocessing.freeze_support() не имеет никакого эффекта, кроме как в Windows. Кроме того, если модуль нормально запускается интерпретатором Python в Windows (программа не была заморожена), то freeze_support() не нужна.

multiprocessing.get_all_start_methods():

Функция multiprocessing.get_all_start_methods() возвращает список поддерживаемых методов запуска, первый из которых используется по умолчанию.

Возможные методы запуска: fork, spawn и forkserver (смотрите их описание в обзорном материале к модулю multiprocessing). В Windows доступен только spawn. В Unix всегда поддерживаются fork и spawn, по умолчанию используется - fork.

>>> import multiprocessing
>>> multiprocessing.get_all_start_methods()
# ['fork', 'spawn', 'forkserver']

multiprocessing.get_context(method=None):

Функция multiprocessing.get_context() возвращает объект контекста, имеющий тот же API, что и сам модуль multiprocessing.

Если аргумент method=None, то возвращается контекст по умолчанию. В противном случае метод запуска процессов должен быть fork, spawn или forkserver.

Если указанный метод запуска недоступен, то возникает исключение ValueError.

import multiprocessing

def worker(q):
    q.put('hello')

if __name__ == '__main__':
    ctx = multiprocessing.get_context('spawn')
    q = ctx.Queue()
    p = ctx.Process(target=worker, args=(q,))
    p.start()
    print(q.get())
    p.join()

Объекты контекста позволяют использовать несколько методов запуска в одной программе.

Обратите внимание, что объекты, относящиеся к одному контексту, могут быть несовместимы с процессами для другого контекста. В частности, блокировки, созданные с использованием контекста fork, не могут быть переданы процессам, запущенным с помощью методов запуска spawn или forkserver.

multiprocessing.get_start_method(allow_none=False):

Функция multiprocessing.get_start_method() возвращает имя метода запуска, используемого для запуска процессов.

Если метод запуска не был исправлен и аргумент allow_none имеет значение False, то метод запуска фиксируется по умолчанию и возвращается его имя.

Если метод запуска не был исправлен и аргумент allow_none имеет значение True, то возвращается None.

Возвращаемое значение может быть fork, spawn, forkserver или None. Значением по умолчанию в Unix является метод запуска процессов fork, а в Windows по умолчанию - spawn.

>>> import multiprocessing
>>> multiprocessing.get_start_method()
# 'fork'

multiprocessing.set_executable():

Функция multiprocessing.set_executable() задает путь интерпретатора Python для использования при запуске дочернего процесса. По умолчанию используется sys.executable.

Для встраиваемых программ, вероятно, потребуется что-то вроде:

from multiprocessing import set_executable

set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))

прежде чем они смогут создавать дочерние процессы.

multiprocessing.set_start_method(method):

Функция multiprocessing.set_start_method() устанавливает метод, который следует использовать для запуска дочерних процессов. Метод запуска процессов может быть fork, spawn или forkserver.

Обратите внимание, что функция должна вызываться не более одного раза и должна быть защищена внутри блока if __name__ == '__main__' основного модуля.

import multiprocessing

def worker(q):
    q.put('hello')

if __name__ == '__main__':
    multiprocessing.set_start_method('spawn')
    q = multiprocessing.Queue()
    p = multiprocessing.Process(target=worker, args=(q,))
    p.start()
    print(q.get())
    p.join()