Форум программистов, компьютерный форум, киберфорум
Фаер
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Python. Параллельные процессы.

Запись от Фаер размещена 07.10.2012 в 10:14
Показов 18682 Комментарии 0
Метки python

Если Вы читали прошлые записи, то, должно быть, помните, что такое GIL. Так же Вы, наверняка, обратили внимание на моё заявление о том, что её можно обойти с помощью процессов. Так вот, пришла пора это сделать.

Замечу: параллельные процессы - это изобретение для многопроцессорных систем. Правда, я опробовал мультипроцессинг на Android'е и могу сказать, что скрипты работают и даже выполняют задачи параллельно. Однако это не значит, что одноядерный процессор может выполнять две задачи одновременно, скорее это означает, что он создаёт параллельные потоки.

Для того, чтобы посчитать кол-во процессоров на своём компьютере, введите следующие команды:

Python
1
2
import multiprocessing
multiprocessing.cpu_count()
Если Вы уже разобрались с классом Thread(), то быстро разберётесь и с процессами, так как устроены они практически одинаково:

Python
1
2
3
4
5
6
7
8
9
10
from multiprocessing import Process
from time import sleep
def fun():
    sleep(2)
    print('Hello,world!')
p=Process(target=fun,args=())
p.start()
sleep(5)
print('Done')
input()
Снова Мы используем этот скрипт. Но на этот раз он работает с процессами.

Важное замечание:
Если Вы работаете с модулем multiprocessing в Linux'е или Android'е, то проблем возникнуть не должно(проверено на практике). Но в Windows'е эти программы могут начать чудить: каждый дочерний процесс будет запускать идентичный процесс. В результате происходит своего рода зацикливание. В консоли будут одна за другой появляться одинаковые надписи, а заглянув в диспетчер задач, Вы обнаружите там целую гору процессов, запущенных Вашим скриптом. Чтобы избежать подобного недоразумения нужно писать мультипроцессинговые программы в таком репертуаре:

Python
1
2
3
4
5
6
7
8
9
10
11
12
from multiprocessing import Process
from time import sleep
def fun():
    sleep(2)
    print('Hello,world!')
p=Process(target=fun,args=())
 
if __name__=='__main__':
    p.start()
    sleep(5)
    print('Done') 
    input()
Инструкция if __name__=='__main__': разрешает запускать параллельные процессы только из основного. А вот дочерний процесс уже не сможет породить ещё один аналогичный процесс.

Но вернёмся к Нашему скрипту. Как видите, класс Process() практически аналогичен Thread()'у.
Дождаться завершения процесса можно с помощью метода join(), с которым Мы познакомились в прошлой записи. Вот только приостановить, а потом продолжить выполнение процесса вроде как нельзя. Зато его выполнение можно остановить насовсем:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from multiprocessing import Process
from time import sleep
def fun():
    while True:
        print('Hello,world!')
        sleep(0.5)
p=Process(target=fun,args=())
 
if __name__=='__main__':
    p.start()
    sleep(3)
    p.terminate()
    print('Done') 
    input()
Для наглядности Мы используем бесконечный цикл. Однако через три секунды после старта запущенный скриптом процесс(тот самый цикл) будет остановлен командой p.terminate(). Заметьте, что инструкция на завершение подаётся из основного процесса.

Класс Process() имеет такое свойство, как daemon. Суть его состоит в следующем: по умолчанию программа, после выполнения всех команд в основном процессе, ожидает завершения процессов дочерних. Атрибут daemon позволяет обойти это ограничение:

Python
1
2
3
4
5
6
7
8
9
10
11
12
from multiprocessing import Process
from time import sleep
def fun():
    sleep(5)
    print('Hello,world!')
p=Process(target=fun,args=())
 
if __name__=='__main__':
    p.daemon=True
    p.start()
    sleep(2)
    print('Done')
В данном случае дочерний процесс выполняется пять секунд, а основной только две. Как результат, окно консоли закроется сразу после появления надписи "Done", то есть, сразу после того, как будут выполнены все команды основного процесса. Если же убрать строку p.daemon=True, программа будет ожидать завершения дочернего процесса. Команда p.daemon=True, записанная после старта процесса р приведёт к ошибке. Кстати, класс Thread() тоже имеет атрибут daemon, поэтому, если Вы хотите, чтобы программа не дожидалась завершения дочерних потоков, используйте th.daemon=True.
Метки python
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru