>import multiprocessing
>import os
>def do_this(what):
>····whoami(what)
>def whoami(what):
>····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(). В следующем примере наш процесс должен досчитать до миллиона, засыпая после каждого шага на секунду и выводя раздражающее сообщение. Однако у нашей основной программы заканчивается терпение, и она сбивает его с орбиты:
>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()
Когда я запускаю эту программу, я вижу следующее:
>I'm main, in process 97080
>I'm loopy, in process 97081
>····Number 1 of 1000000. Honk!
>····Number 2 of 1000000. Honk!
>····Number 3 of 1000000. Honk!
>····Number 4 of 1000000. Honk!
>····Number 5 of 1000000. Honk!