|
|
1
9
是的,你用错了。EventMachine的工作原理是发出异步IO调用,这些调用立即返回,并在完成时通知“reactor”(由EM.run启动的事件循环)。您有两个阻塞调用,它们破坏了系统的功能sleep和Mechanize.get。必须使用特殊的异步/非阻塞库从EventMachine派生任何值。 |
|
|
2
25
这个线程中的所有答案都缺少一个关键点:回调在reactor线程中运行,而不是在单独的延迟线程中运行。在中运行Mechanize请求
当你跑的时候
这大约需要12秒,对于并行睡眠是1秒,对于并行睡眠是10秒 序列号 睡觉,头上有1秒。
要并行运行回调代码,必须使用使用
这个版本运行了大约3秒钟,这占了1秒钟的并行操作睡眠时间,1秒钟的回调睡眠时间 平行 一秒钟的开销。 |
|
|
4
2
EventMachine“defer”实际上从它管理的线程池中生成Ruby线程来处理您的请求。是的,EventMachine是为非阻塞IO操作而设计的,但是defer命令是一个例外——它允许您在不阻塞reactor的情况下执行长时间运行的操作。 所以,它会比裸线程慢一点,因为实际上它只是用EventMachine的线程池管理器的开销来启动线程。 您可以在此处阅读有关延迟的更多信息: http://eventmachine.rubyforge.org/EventMachine.html#M000486 这就是说,获取页面是EventMachine的一个很好的用途,但是正如其他海报所说的,您需要使用一个非阻塞IO库,然后使用next\ tick或类似的工具来启动您的任务,而不是defer,这将使您的任务脱离reactor循环。 |