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

Asynchronous Goliath或EventMachine如何切换上下文?,asynchronous,eventmachine,goliath,Asynchronous,Eventmachine,Goliath,假设我有一个I/O有界的操作。我确实有回调(或em同步) EM如何切换到处理下一个请求,使前一个请求等待回调 它是如何隔离Thread.current变量的? 如何模拟长时间运行的作业 1。EM如何切换到处理下一个请求,使前一个请求等待回调? 在任何反应器模式中都有一个执行线程。也就是说,一次只能执行一件事情。如果反应器正在处理该主线程上的请求,则其他请求无法干预(协作调度)。现在,请求可以自愿地“放弃”控制(在EM中,我们有EM.next_tick{block}),或者通过在将来安排一个操作:

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

  • EM如何切换到处理下一个请求,使前一个请求等待回调
  • 它是如何隔离Thread.current变量的?
  • 如何模拟长时间运行的作业

  • 1。EM如何切换到处理下一个请求,使前一个请求等待回调?

    在任何反应器模式中都有一个执行线程。也就是说,一次只能执行一件事情。如果反应器正在处理该主线程上的请求,则其他请求无法干预(协作调度)。现在,请求可以自愿地“放弃”控制(在EM中,我们有
    EM.next_tick{block}
    ),或者通过在将来安排一个操作:一个计时器(
    EM.add_timer{block}
    ),或者通过进行另一个IO操作

    例如,如果您使用EM Synchrony,那么当您发出HTTP请求(通过EM HTTP)时,当发送请求时,光纤将暂停,并在引擎盖下为您创建回调。。请求完成后,EventMachine通过内部回调调用回调。。控制返回到您的请求。要获得更深入的了解,请执行以下操作:

    2。它是如何隔离Thread.current变量的?

    没有魔法。在Ruby中,我们有线程局部变量:
    thread.current[:foo]=bar
    。类似地,光纤具有相同的语义,尽管有时会让人措手不及的是使用了相同的机制。。aka
    Thread.current[:foo]=bar

    请看这里:

    3。如何模拟长时间运行的作业?

    最好的办法是:把它们移出反应堆。任何反应堆系统都是如此

    a) 创建作业队列并将其推送到另一个进程 b) EM确实提供了
    EM.defer
    ,这会产生另一个线程


    尽可能选择(a)而不是(b)。。你以后会感谢你自己的。

    谢谢,@igrigorik。在3。我的意思是,我有em mongo,我想测试这个请求不会阻塞反应堆。也许有一个普通的地方我可以放“睡眠”?你永远不想在反应堆里使用睡眠。一切都在主线程上运行(基本上),睡眠会暂停一切。最好的测试方法是查看您的服务器是否可以处理多个连接。如果你连接到mysql,你也可以做一些事情,在这里你“选择睡眠(1)”,这将导致mysql阻塞,但这发生在mysql内部,而不是反应堆内部。然后,如果你发出10个查询,它们应该在1秒内全部返回,而不是10秒。我需要的正是“选择睡眠(1)”。谢谢