Разъяснение наличия асинхронной и синхронизированной поддержки
Я полностью понимаю асинхронную обработку событий. Я полностью понимаю волокна. И я полностью понимаю, как работает EventMachine. Тем не менее, я натолкнулся на этот драгоценный камень Ruby под названием em-synchrony. В своих документах они неоднократно заявляют, что их библиотека имеет "поддержку запросов синхронизации / асинхронности". Я хотел бы получить некоторую ясность о том, что именно это означает. Например, они говорят это:
Fiber aware ConnectionPool with sync/async query support
Затем они предоставляют этот пример:
require "em-synchrony"
require "em-synchrony/mysql2"
EventMachine.synchrony do
db = EventMachine::Synchrony::ConnectionPool.new(size: 2) do
Mysql2::EM::Client.new
end
multi = EventMachine::Synchrony::Multi.new
multi.add :a, db.aquery("select sleep(1)")
multi.add :b, db.aquery("select sleep(1)")
res = multi.perform
p "Look ma, no callbacks, and parallel MySQL requests!"
p res
EventMachine.stop
end
Я считаю, что асинхронная поддержка - это призыв к db.aquery
, По сути, в Linux он будет использовать сигнал select или epoll для предотвращения блокировки. Теперь, когда они поддерживают синхронно, они ссылаются на эту строку: multi.perform
, То есть выполнение кода будет блокироваться на multi.perform
пока оба aquery
вызовы возвращают результаты (то есть цикл события EventMachine будет заблокирован)? Вот где я запутался. Где здесь синхронный звонок?