Доклад посвящен Coro, его применению, разбору достоинств и недостатков. Особое внимание спикер уделит применению Coro в асинхронном программировании в связке с AnyEvent и генераторов.
3. Cooperative Threads.
Coroutine, сопрограмма, «корутина» -
компонент программы, который
поддерживает множество входных точек ,
остановку и продолжение выполнения с
сохранением определённого состояния.
В Coro — «корутины» представлены
модулями Coro::State, и высокоуровневым
Coro.
5. Cooperative Threads.
use Coro;
async {
print "async 1n";
cede;
print "async 2n";
};
print "main 1n";
cede;
print "main 2n";
cede;
Async - Создание корутины
Тело корутины
Main корутина
6. Cooperative Threads.
Cede, yield — передача управления
Main корутина
use Coro;
async {
print "async 1n";
cede;
print "async 2n";
};
print "main 1n";
cede;
print "main 2n";
cede;
7. Cooperative Threads.
cede — перемещает «корутину» в конец
очереди и вызывает schedulle.
schedulle — вызывает шедулер, он
выбирает следующую "корутину" из очереди
и передает выполнение ей. Если очередь
пуста, - то передается выполнение
$Coro::idle.
8. Deadlock.
Deadlock - ситуация в многозадачной среде,
при которой несколько процессов находятся
в состоянии бесконечного ожидания
ресурсов, захваченных самими этими
процессами.
В Coro — это состояние, когда нет «корутин»
готовых к выполнению. Ситуация
обрабатывается в $Coro::idle.
11. Channel.
Channel, канал — модель межпроцессного
взаимодействия и синхронизации через
передачу сообщений.
В Coro — представлен модулем
Coro::Channel, реализован с помощью
Coro::Semaphore
13. Channel.
use Coro;
my $chan = new Coro::Channel 2;
# $chan
async {
while(my $val = $chan->get){
warn "chan out:" . $val;
}
};
$chan->put($_) for(1..3);
Канал на 2 элемента
Ждем данные
Кладем данные в канал
18. AnyEvent::HTTP
http_get "http://mail.ru", rouse_cb;
my ($data, $hdr) = rouse_wait;
return undef if $hdr->{Status} =~ m/^2/;
#Работаем с телом ответа
Отдаёт управление
Возвращает управление
AnyEvent
my $int_w = AnyEvent->signal (
signal => "INT",
cb => Coro::rouse_cb );
Coro::rouse_wait;
#Обрабатываем сигнал.
19. Coro::Generator
Generator, генератор — одним из способов
реализации итераторов является
использование сопроцедур, которые могут
возвращать управление (и вычисленные
результаты) несколько раз, запоминая своё
состояние и точку возврата в предыдущем
вызове.
20. Coro::Generator
use Coro::Generator; # import 'generator' and 'yield'
my $even = generator {
my $x = 0;
while(1) {
$x += 2;
yield $x;
}
};
# This will print even numbers from 2..20
for(1..10) {
print $even->() . "n";
}
тело генератора
yield — сохранение состояния