假设我有一个I/O有界运算。我确实有一个回调(或同步)
- EM如何切换到处理下一个请求,使上一个请求等待回调
- 它如何保持Thread.current变量的隔离
- 我如何模仿长期工作
1。EM如何切换到处理下一个请求,使上一个请求等待回调
在任何反应器模式中,都有一个执行线程。意思是,一次只能执行一件事。如果reactor正在处理该主线程上的请求,那么没有其他请求可以干预(协作调度)。现在,请求可以自愿"放弃"控制(在EM中,我们有EM.next_tick { # block }
),也可以通过安排未来的操作:计时器(EM.add_timer { #block }
),或者通过进行另一个IO操作!
例如,如果您使用EM Synchrony,那么当您发出HTTP请求(通过EM HTTP)时,当发送请求时,光纤将暂停,并在后台为您创建回调。。请求完成后,EventMachine会通过内部回调调用回调。。控制权返回到您的请求。要更深入地了解:http://www.igvita.com/2010/03/22/untangling-evented-code-with-ruby-fibers/
2.如何保持Thread.current变量的隔离
没有魔法。在Ruby中,我们有线程局部变量:Thread.current[:foo] = bar
。类似地,Fiber具有相同的语义,尽管有时会让人措手不及的是使用了相同的机制。。又称CCD_ 4。
请参见此处:http://devblog.avdi.org/2012/02/02/ruby-thread-locals-are-also-fiber-local/
3.如何模仿长期运行的工作
最佳方法:将它们移出反应堆。任何反应堆系统都是如此。
a) 创建作业队列并将其推送到另一个进程b) EM确实提供了EM.defer
,它派生了另一个线程。
尽可能选择(a)而不是(b)。。你稍后会感谢自己的。