Простой Python. Современный стиль программирования (Любанович) - страница 170

>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!

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

Программисты прилагают удивительное количество усилий в процессе работы с датами и временем. Поговорим о некоторых проблемах, с которыми они сталкиваются, а затем рассмотрим лучшие способы и приемы, позволяющие проще с ними справиться.