Разъяснение наличия асинхронной и синхронизированной поддержки

Я полностью понимаю асинхронную обработку событий. Я полностью понимаю волокна. И я полностью понимаю, как работает 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 будет заблокирован)? Вот где я запутался. Где здесь синхронный звонок?

0 ответов

Другие вопросы по тегам