Goliath或EventMachine如何切换上下文?

时间:2012-09-03 09:00:43

标签: asynchronous eventmachine goliath

假设我有一个I / O限制的操作。我有回调(或同步)

  1. EM如何切换到proccess下一个请求,让前一个请求等待回调?
  2. 如何保持Thread.current变量被隔离?
  3. 如何模拟长时间运行的作业?

1 个答案:

答案 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)..稍后你会感谢自己。