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()