我想对此提出一些意见,因为它有助于指导我在学习中应该关注什么(如果我应该考虑线程的话)。
是否存在绝对需要线程且多进程模型无法提供适当解决方案的 Rails 应用程序示例。一个例外是具有内存限制并且需要使用线程而不是产生多个进程的应用程序。但是假设内存不是问题,还有哪些其他情况下线程是更好的选择?
我想对此提出一些意见,因为它有助于指导我在学习中应该关注什么(如果我应该考虑线程的话)。
是否存在绝对需要线程且多进程模型无法提供适当解决方案的 Rails 应用程序示例。一个例外是具有内存限制并且需要使用线程而不是产生多个进程的应用程序。但是假设内存不是问题,还有哪些其他情况下线程是更好的选择?
线程更容易编写和调试。我将从简单的非线程代码开始,对其进行调试,然后在最后用Thread.new
and包装一个块,join
我就完成了。
而且,是的,研究它们。您将学习有用的技术并获得在您的“编程工具箱”中有用的知识。
至于线程可以做什么进程不能?线程可以很容易地共享数据并从同一个队列或多个队列中工作。使用单独的进程执行此操作需要数据库或 IPC 或使用消息队列,所有这些都增加了很多复杂性(尽管它们也可以增加容量。)
通常,线程比进程更有效地创建/拆除。
SideKiq比Resque更高效主要是因为 SideKiq 工作人员是线程,而 Resque 使用分叉工作人员(进程)。
但问题是 MRI 上的 Ruby 没有本地线程,因此 Ruby 中的每个线程都受到全局解释器锁 (GIL) 的限制。有关更多信息,请参阅这篇 Igvita 文章:http ://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/
在 JRuby 等具有本机线程的平台上,您可以拥有一个多线程 Rails 应用程序(在 servlet 容器中运行),它的性能可能会胜过在 MRI 下运行的同一个应用程序。Hotspot JVM 上的 JRuby 也有可能进行即时性能优化。