В разделе рассмотрены функции модуля multiprocessing
, при помощи которых можно узнать различные сведения о рабочих процессах, запущенных из программы.
multiprocessing.active_children()
список всех живых дочерних процессов,multiprocessing.cpu_count()
количество имеющихся ядер процессора,multiprocessing.current_process()
возвращает объект Process
текущего процесса,multiprocessing.parent_process()
возвращает объект Process
родительского процесса,multiprocessing.freeze_support()
поддержка замороженных процессов,multiprocessing.get_all_start_methods()
список поддерживаемых методов запуска,multiprocessing.get_context()
возвращает объект контекста,multiprocessing.get_start_method()
возвращает имя метода запуска,multiprocessing.set_executable()
задает путь интерпретатора Python,multiprocessing.set_start_method()
устанавливает метод запуска дочерних процессов.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()