首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Goliath或EventMachine如何切换上下文?

Goliath或EventMachine如何切换上下文?
EN

Stack Overflow用户
提问于 2012-09-03 09:00:42
回答 1查看 504关注 0票数 4

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

  1. EM如何切换到处理下一个请求,保持上一个请求等待回调?

  1. 它如何保持Thread.current变量的隔离?

  1. 我怎样才能模仿长期工作呢?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-06 02:43:19

1. EM如何切换到处理下一个请求以保持上一个请求等待回调?

在任何反应堆模式中,都有一个执行线程。意思是,一次只能执行一件事。如果反应堆正在处理该主线程上的请求,则没有其他请求可以干预(协作调度)。现在,请求可以自愿地“放弃”控制权(在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)。你以后会感谢你自己的。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12244829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档