Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
EventMachine 
Что делать, если вы соскучились по callback-ам?
Что такое 
асинхронность?
Наша жизнь 
однопоточна
Reactor 
Ожидание событий 
Event Loop 
Обработка событий 
Callbacks
Когда нам нужен 
EventMachine? 
• Работа с сетью (HTTP, TCP, e.t.c) 
• Работа с ФС 
• Запросы к БД 
• любые другие операции, вынуждающие 
процесс ждать
Скорость
Асинхронность в 
Ruby
Sync 
Async
Sync 
Async
Иногда могут быть 
проблемы 
vs
EventMachine
Установка
EventMachine API
EM.run 
• Запускает EventLoop 
• Принимает блок 
• Запускается в текущем процессе
EM.stop
EM.next_tick 
Ставит блок на следующую итерацию реактора
Таймеры
Event Machine
Event Machine
Threads 
• Не блокирует основной поток 
• Появляются проблемы с thread-safety 
• Как добраться до EventLoop?
EM.schedule 
• Обертка вокруг EM.next_tick 
• Нужно использовать, если EM отличен от 
основного треда 
• Бережет от threaded-проблем
EM.defer 
Запускает блок параллельно основному потоку 
В отдельном потоке 
Снова в реакторе
EM.Deferrable 
• Это не defer 
• Модуль 
• Добавляется к вашим классам 
• Коллбэки
Функциональность 
Deferrable 
Успешное 
завершение 
Ошибка
EM::Channel
Работа с сетью 
• EM.start_server (stop_server) 
• EM.connect 
Наследует от EM::Connection
EM::Connection 
События (вызывает EventLoop) 
• post_init 
• connection_completed 
• receive_data 
• unbind 
• ssl_verify_peer 
• ssl_handshake_completed 
Методы (вызывает пользователь) 
• send_data 
• close_connection 
• close_connection_after_writing 
• get_peername 
• pause/resume 
• e.t.c
EM::Protocols 
aka EM::P
Традиционная работа с 
потоками 
Сеть
Выведет «Finally received an amazing Hash»
C10K
Event Machine
select и epoll 
• select и poll медленныe. Они вынужденны 
передавать все дескрипторы и возвращать 
состояние для всех 
• Так не только для файлов, но и для соединений 
и т.п. 
• epoll/kqueue срабатывает при готовности 
дескриптора 
• EM по умолчанию работает с select
Как включить epoll?
Другие фишки 
• system 
• watch 
• attach 
• watch_file 
• watch_process 
• popen 
• e.t.c
Пример
Библиотеки 
• https://github.com/igrigorik/async-rails 
• https://github.com/igrigorik/em-synchrony 
• https://github.com/stevegraham/em-rspec 
• https://github.com/jcoglan/rspec-eventmachine
Выводы 
• EventMachine добавляет скорости 
• EventMachine добавляет проблем 
• EventMachine - не панацея 
Nobody is right, 
everyone is 
wrong 
• Для настоящей многопоточности есть другие 
инструменты (Go, Erlang, Rust… whatever) 
Какой из них лучше?
Куда дальше? 
• Homepage http://rubyeventmachine.com/ 
• GitHub 
https://github.com/eventmachine/eventmachine 
• Wiki 
https://github.com/eventmachine/eventmachine/w 
iki

More Related Content

Event Machine