澄清了异步和同步支持

时间:2016-09-18 15:39:11

标签: ruby asynchronous eventmachine fiber

我完全理解异步事件处理。我完全理解纤维。我完全理解EventMachine的工作原理。但是,我遇到了这个名为em-synchrony的Ruby gem。在他们的文档中,他们反复声明他们的库具有“同步/异步查询支持”。我想清楚一下这究竟意味着什么。例如,他们这样说:

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 个答案:

没有答案