Чтение онлайн

на главную - закладки

Жанры

Язык программирования Perl

Шохирев Михаил Васильевич

Шрифт:

Отправка сигнала одним процессом другому также используется в качестве средства взаимодействия процессов. Сигнал отправляется процессу с помощью функции kill, которой передаются два аргумента: номер сигнала и PID процесса. Схему реагирования порожденного процесса на сигналы, получаемые от процесса-предка, можно увидеть на следующем учебном примере:

my $parent = $$; # PID родительского процесса

my $pid = fork; # 'разветвить' текущий процесс

# fork вернет PID потомка в процессе-предке
и 0 в потомке

die "fork не отработал: $!" unless defined $pid;

if ($pid) { # ---------- родительский процесс ----------

print "Начался предок PID $$\n";

for (1..3) {

print "Предок PID $$ работает $_\n";

print "Предок PID $$ отправил сигнал\n";

kill HUP, $pid;

sleep 2; # 'заснуть' на 2 секунды

}

print "Закончился предок (PID $$)\n";

}

unless ($pid) { # ---------- дочерний процесс ----------

my $counter = 0; # счетчик полученных сигналов

$SIG{HUP} = sub { ### обработчик сигнала ###

$counter++;

print "\tПотомок получил $counter-й сигнал!\n";

}; ### конец обработчика сигнала ###

print "\tНачался потомок PID $$ предка $parent\n";

for (1..7) {

print "\tПотомок PID $$ работает $_\n";

sleep 1; # 'заснуть' на 1 секунду

}

print "\tЗакончился потомок PID $$\n";

}

Поведение этих процессов во время выполнения программы можно проследить по выводимым ими сообщениям:

Начался потомок PID -800 предка 696

Потомок PID -800 работает 1

Начался предок PID 696

Предок PID 696 работает 1

Предок PID 696 отправил сигнал

Потомок получил 1-й сигнал!

Потомок PID -800 работает 2

Предок PID 696 работает 2

Предок PID 696 отправил сигнал

Потомок PID -800 работает 3

Потомок получил 2-й сигнал!

Потомок PID -800 работает 4

Предок PID 696 работает 3

Предок PID 696 отправил сигнал

Потомок PID -800 работает 5

Потомок получил 3-й сигнал!

Потомок PID -800 работает 6

Закончился предок (PID 696)

Потомок PID -800 работает 7

Закончился потомок PID -800

Сигналы нельзя считать слишком надежным и информативным средством обмена информацией: для передачи данных лучше использовать другие способы. Зато можно проверить состояние дочернего

процесса, отправив ему особый нулевой сигнал функцией kill(0, $pid). Этот вызов не влияет на выполнение процесса-потомка, но возвращает истину (1), если процесс "жив", и ложь (0), если он завершился или ему нельзя посылать сигналы. Одинаковая реакция на нулевой сигнал гарантируется на различных платформах. Кроме того, можно прекратить выполнение дочернего процесса, отправив ему сигнал KILL вызовом kill(KILL, $pid).

В последних версиях Perl появилась еще одна модель многозадачности - легковесные процессы (light-weight processes), называемые также потоками управления или нитями. (По-английски фраза "Perl threads" звучит как каламбур и может быть переведена как "нитки жемчуга" или "жемчужные ожерелья"). Нити отличаются от полновесных процессов с независимыми ресурсами тем, что выполняются в рамках одного процесса в единой области памяти. Поэтому создание нити происходит быстрее запуска отдельного процесса и требует меньше ресурсов операционной системы. Выполнение нитей в одной области памяти позволяет эффективно организовать совместный доступ к разделяемым данным. Кроме того, программист получает более полный контроль над параллельно выполняющимися потоками управления. Принципиальное различие между полновесными процессами, созданными операционной системой, и многопоточными нитями показано на рис. 16.1.

Рис. 16.1.Полновесные процессы и нити (потоки управления)

Существует несколько моделей многопоточной обработки, например DEC, Java, POSIX, Win32. Perl предлагает свою модель многопоточного программирования, отличающуюся от перечисленных и имеющую свои достоинства и недостатки. Появление в Perl кросс-платформенных средств работы с легковесными процессами стало несомненным достижением, которое заставило по-новому взглянуть на программирование параллельных процессов. Применение легковесных процессов позволяет разрабатывать эффективные приложения, одинаково выполняющиеся на разных платформах.

Работать с легковесными процессами просто. Подключив средства работы с нитями прагмой use threads, можно создать нить с помощью метода threads->new (синоним: threads->create). Этому методу передается ссылка на именованную или анонимную подпрограмму, которая запускается на выполнение в виде параллельного потока управления. Результатом создания нити станет ссылка на объект типа threads, который будет использоваться для управления потоком. Создание нити выглядит так:

use threads; # подключить многопоточные средства

my $thread = threads->new(\&pearl_thread); # запустить нить

sub pearl_thread { # эта подпрограмма

print "Это нить.\n"; # будет выполняться как нить

} #

Итак, в определенной точке программы нить начала выполняться параллельно действиям в основной программе. Куда же должен произойти возврат, когда нить завершится? Это задается в основной программе с помощью метода join, который приостанавливает работу программы до завершения выполнения нити и возвращает результат, вычисленный нитью:

Поделиться:
Популярные книги

Как выиграть любой спор. Дома, на работе, в суде – где угодно

Спенс Джерри
Научно-образовательная:
психология
5.75
рейтинг книги
Как выиграть любой спор. Дома, на работе, в суде – где угодно

Суперприбыльный салон красоты. Как преуспеть в этом бизнесе

Кузнецов Михаил
Деловая литература:
малый бизнес
7.00
рейтинг книги
Суперприбыльный салон красоты. Как преуспеть в этом бизнесе

Огненный крест. Книги 1 и 2

Гэблдон Диана
5. Чужестранка
Любовные романы:
исторические любовные романы
8.43
рейтинг книги
Огненный крест. Книги 1 и 2

Второгодка. Книга 3. Ученье свет

Ромов Дмитрий
3. Второгодка
Фантастика:
городское фэнтези
сказочная фантастика
альтернативная история
5.25
рейтинг книги
Второгодка. Книга 3. Ученье свет

Кир Булычев. Собрание сочинений в 18 томах. Т.15

Булычев Кир
Собрания сочинений
Детские:
детская фантастика
7.50
рейтинг книги
Кир Булычев. Собрание сочинений в 18 томах. Т.15

Т. 13 Число зверя

Хайнлайн Роберт Энсон
13. Отцы-основатели. Весь Хайнлайн
Фантастика:
научная фантастика
7.00
рейтинг книги
Т. 13 Число зверя

Воронцов. Перезагрузка. Книга 2

Тарасов Ник
2. Воронцов. Перезагрузка
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Воронцов. Перезагрузка. Книга 2

Кровавые обещания

Мид Райчел
4. Академия вампиров
Фантастика:
ужасы и мистика
9.47
рейтинг книги
Кровавые обещания

Первый среди равных. Книга VI

Бор Жорж
6. Первый среди Равных
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VI

Эволюционер из трущоб. Том 10

Панарин Антон
10. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 10

Прапорщик. Назад в СССР. Книга 7

Гаусс Максим
7. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прапорщик. Назад в СССР. Книга 7

Дети капитана Гранта

Верн Жюль Габриэль
3. Библиотека приключений
Приключения:
путешествия и география
9.27
рейтинг книги
Дети капитана Гранта

Курс 1. Сентябрь

Фокс Гарри
1. Маркатис
Фантастика:
аниме
фэнтези
сказочная фантастика
5.00
рейтинг книги
Курс 1. Сентябрь

Арлекин

Гамильтон Лорел Кей
15. Анита Блейк
Фантастика:
ужасы и мистика
9.20
рейтинг книги
Арлекин