我完全理解异步事件处理。我完全理解纤维。我完全理解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事件循环将被阻止)?这是我感到困惑的地方。同步电话在哪里?