Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 224

print("Process %s says: %s" % (os.getpid(), what))

if __name__ == "__main__":

whoami("I'm the main program")

for n in range(4):

p = multiprocessing.Process(target=do_this,

args=("I'm function %s" % n,))

p.start()

Когда я запускаю этот пример, то вижу на экране следующее:

Process 6224 says: I'm the main program

Process 6225 says: I'm function 0

Process 6226 says: I'm function 1

Process 6227 says: I'm function 2

Process 6228 says: I'm function 3

Функция Process() породила новый процесс и запустила в нем функцию do_this().

Поскольку мы делали это в цикле с четырьмя итерациями, мы сгенерировали че-

тыре новых процесса, которые выполнили методы do_this() и завершились.

Модуль multiprocessing имеет множество возможностей. Он предназначен для

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

сэкономить время, например загрузить веб-страницу для получения с нее данных,

изменить размер изображений и т. д. Он содержит способы разместить задачи в оче-

редь, позволить процессам общаться и подождать, пока все процессы завершатся.

В разделе «Конкуренция» главы 11 содержится более подробная информация.

Убиваем процесс

с помощью функции terminate()

Если вы создали один или несколько процессов и по какой-то причине хотите за-

вершить один из них (возможно, он застрял в цикле, или вам стало скучно, или вы

хотите побыть жестоким правителем), используйте функцию terminate(). В следу-

ющем примере наш процесс должен досчитать до миллиона, засыпая после каждо-

Календари и часы

291

го шага на секунду и выводя раздражающее сообщение. Однако у нашей основной

программы заканчивается терпение, и она сбивает его с орбиты:

import multiprocessing

import time

import os

def whoami(name):

print("I'm %s, in process %s" % (name, os.getpid()))

def loopy(name):

whoami(name)

start = 1

stop = 1000000

for num in range(start, stop):

print("\tNumber %s of %s. Honk!" % (num, stop))

time.sleep(1)

if __name__ == "__main__":

whoami("main")

p = multiprocessing.Process(target=loopy, args=("loopy",))

p.start()

time.sleep(5)

p.terminate()