假设我有一个I / O限制的操作。我有回调(或同步)
答案 0 :(得分:6)
<强> 1。 EM如何切换到proccess下一个请求,让前一个请求等待回调?
在任何反应堆模式中都有一个执行线程。意思是,一次只能执行一件事。如果反应器正在处理该主线程上的请求,则没有其他请求可以干预(协作调度)。现在,请求可以自动“放弃”控制(在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
。类似地,光纤具有相同的语义,尽管有时会让人们措手不及的是使用相同的机制。又名Thread.current[:foo] = bar
。
见这里:http://devblog.avdi.org/2012/02/02/ruby-thread-locals-are-also-fiber-local/
第3。如何模拟长时间运行的作业?
最佳方法:将它们移出反应堆。 任何反应堆系统都是如此。
a)创建一个作业队列并将其推送到另一个进程
b)EM确实提供了EM.defer
,它产生了另一个线程。
尽可能选择(a)(b)..稍后你会感谢自己。