52. Пара слов о промисах в Perl 6

В Perl 6 есть понятие промисов и, соответственно, тип данных Promise. Давайте разберем одну простую программу, которая частично приоткрывает идею, как вы можете использовать промисы с своих программах.

my $promise = Promise.new;

start {
    sleep 3;
    $promise.keep;
}

for 1..* {
    .say;
    sleep 1;    
    last if $promise;
}

Сначала создается объект типа Promise, он сохраняется в одноименной переменной $promise. Затем создается отдельный поток, который через три секунды делает промис (обещание) выполненным:

$promise.keep;

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

last if $promise;

В итоге программа печатает числа от одного до трех:

$ perl6 promise.pl 
1
2
3

После создания промис находится в состоянии Planned. Это одно из возможных состояний. Два других — обещание выполнено или нарушено: Kept или Broken.

Посмотреть текущий статус можно с помощью метода status:

my $promise = Promise.new;
say $promise.status; # Planned

Методы keep и break изменяют состояние промиса, например:

$promise.break; 
say $promise.status; # Broken

В булевом контексте сдержанный промис становится истиной, а нарушеный или запланированный — ложью. Именно это преобразование к булевой величине и используется в нашей программе. Альтернативно можно было бы написать все явно:

last if $promise.status eq 'Kept';

Обратите также внимание, что изменение состояние промиса и его чтение были сделаны в разных потоках.

One thought on “52. Пара слов о промисах в Perl 6”

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *