Краткий ввод в реализацию технологии Coroutines в Perl. Понятие event-loop, интерфейс для работы с loop'ами - AnyEvent. Работа с данными в асинхронном режиме.
2. Event-loop
- цикл, который за каждую итерацию проверяет
очередь на наличие каких-либо событий.
По возникновению события, контекст этого
события передаётся следящим за событием
обработчикам.
В Perl существует много разных реализаций
event-loop'ов:
EV, Event, Glib, Tk, Perl, Event::Lib...
3. AnyEvent
- framework, представляющий собой
абстрактный слой над всеми event-loop
реализациями.
Это значит, что Вы можете писать Ваше event-
driven приложение используя абстракцию
AnyEvent, расположенную над любым из
доступных на данной системе event-loop.
4. Coro – что это?
”Coro” от ”coroutine” - ”сопрограмма”. В основе
лежит принцип кооперативной
многопоточности.
В процессе работы два потока должны
взаимодействовать между собой и давать
поработать друг другу, когда это будет
необходимо.
Каждый поток работает с одним
пространством имён. То есть данные
являются общими для всех потоков.
5. Coro – как это?
use Coro;
Выведет:
async { main 1
print "async 1n"; async 1
cede; main 2
print "async 2n"; async 2
};
cede - аналог yield
print "main 1n";
cede;
print "main 2n";
cede;
6. Coro – основные компоненты
Coro::AIO truly asynchronous file and directory I/O
Coro::AnyEvent integrate threads into AnyEvent
Coro::Channel message queues
Coro::EV do events the coro-way, with EV
Coro::Event do events the coro-way, with Event
Coro::Handle non-blocking I/O with a blocking
interface.
Coro::Semaphore counting semaphores
Coro::Signal thread signals (binary semaphores)
Coro::Socket non-blocking socket-I/O
Coro::State first class continuations
Coro::Timertimers and timeouts, independent of any
event loop
Coro::Util various utility functions.
...
8. Threads vs Coro - различия
Coro Threads
Единая область памяти для Память для каждого потока
всех потоков. выделяется копированием
области памяти
родительского потока.
Нет необходимости ”шарить” Необходимо шарить
перменные переменные с общими для
всех потоков данными
Все Coro-потоки работают в Interpreter Threads, Для каждого
одном системном потоке. потока запускается свой Perl
интерпретатора.
Принцип коопераивной Native threads (в Linux),
многопоточности. Передача Эмулирование потоков(в
управления по необходимости. Windows)
9. Threads vs Coro - использование
Coro можно использовать: в сетевых
приложениях, в приложениях с вводом-
выводом, в оконных приложениях(в связке с
GTK, Tk, etc.).
Threads можно использовать где угодно, но
неприятные ограничения в некоторых
случаях заставляют от неё отказываться.