Основы: процессы и блокировки

osnovy processy i blokirovki Системные инструменты параллельного выполнения

В этой книге не так много места, чтобы можно было дать полную оценку этому сложному пакету, поэтому за более подробным описанием обращайтесь к руководству по библиотеке Python. Но если говорить кратко: большинство интерфейсов в этом пакете отражают интерфейсы модулей threading и queue, с которыми мы уже встречались, поэтому они должны показаться вам знакомыми. Например, класс Process в пакете multiprocessing имитирует класс Thread, встречавшийся нам выше, из модуля threading — он позволяет запускать функции параллельно вызывающему сценарию, только в данном случае функция запускается в отдельном процессе, а не в потоке выполнения. Эти основы иллюстрируются в примере 5.29:

Пример 5.29. PP4E\System\Processes\multi1.py

основы применения пакета multiprocessing: класс Process по своему действию напоминает класс threading.Thread, но выполняет функцию в отдельном процессе, а не в потоке; для синхронизации можно использовать блокировки, например, для вывода текста; запускает новый процесс интерпретатора в Windows, порождает дочерний процесс в Unix;

import os

from multiprocessing import Process, Lock

def whoami(label, lock):

msg = ‘%s: name:%s, pid:%s’ with lock:

print(msg % (label, __name__, os.getpid()))

if __name__ == ‘__main__’: lock = Lock() whoami(‘function call’, lock)

p = Process(target=whoami, args=(‘spawned child’, lock)) p.start() p.join()

for i in range(5):

Process(target=whoami, args=((‘run process %s’ % i), lock)).start()

with lock:

print(‘Main process exit.’)

Если запустить этот сценарий, он сначала вызовет функцию непосредственно в процессе; затем запустит эту функцию в новом процессе и дождется его завершения; и наконец, в цикле породит пять параллельно выполняющихся процессов вызовов функции — во всех случаях используется API, идентичный классу threading.Thread, который мы изучали выше в этой главе. Ниже приводится результат запуска сценария в Windows. Обратите внимание, что пять дочерних процессов, порождаемых в конце сценария, завершаются уже после своего родителя, что вполне обычное явление для процессов:

C:\\PP4E\System\Processes> multi1.py

function call: name:__main__, pid:8752 spawned child: name:__main__, pid:9268 Main process exit.

run process 3: name:__main__, pid:9296

run process 1: name:__main__, pid:8792

run process 4: name:__main__, pid:2224

run process 2: name:__main__, pid:8716

run process 0: name:__main__, pid:6936

Так же как класс threading.Thread, встречавшийся нам выше, объект multiprocessing.Process может принимать функцию в аргументе target с параметрами (как сделано в этом примере) или использоваться в качестве родительского класса для переопределения его метода run. Метод start вызывает метод run в новом процессе, а метод run по умолчанию просто вызывает функцию, переданную в аргументе target. Кроме того, как и в модуле threading, метод join ожидает завершения дочернего процесса, а объект Lock является одним из инструментов синхронизации процессов — здесь он используется, чтобы избежать смешивания текста, выводимого процессами на платформах, на которых это может происходить (в Windows такого не происходит).

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий