2012-02-13 103 views
3

我明白,在YARV上运行的Ruby中,线程是指并发而不是并行。我的问题是:单独使用并发可以提高性能的情况是什么?例如,我可以想象,在同时处理多个IO流时,并发会提高性能 - 如果一个任务很慢,那么并不意味着堆栈中的所有下一个任务都必须等待该任务完成。我对吗?还有其他类似的情况吗? [hopes that YARV will ever remove the GIL]/[overhead of creating threads with the GIL]比率现在是否开始在Ruby中使用线程?并发性可以提高性能吗?

+0

你是对的猜测 – Adrian 2012-02-13 19:57:33

+0

对于未来的读者来说,[this](http://www.engineyard.com/blog/2010/concurrency-real-and-imagined-in-mri-threads/)的帖子是非常很有帮助。 – user2398029 2012-02-15 01:47:56

回答

5

如果您有多个任务需要等待一些不经常发生的外部刺激(例如,网络数据变为可用,磁盘读取完成等),那么并发会非常有益。如果您只是坐在在循环中,等待这些操作中的一个发生,你要么

  1. 等待很长一段时间,一些单一的事件来完成,而另一些已经完成,正在等待着你去看看他们,或
  2. 浪费CPU能量循环数百个不同的事件,这些事件没有被触发,寻找实际已经触发的事件。

并发性在设计固有事件驱动的程序时也很有用,例如等待不同的UI事件发生。在这种情况下,您可以指定响应不同UI事件触发的任务,并且处理器可以处于休眠状态或处理其他任务,而无需显式等待未触发的任务运行。只要事件发生,那些线程就可以唤醒并共享CPU处理时间。

希望这会有所帮助!

+0

感谢您的回答。我有一个更具体的问题 - 让我们说一个应用程序执行一堆高度递归的树操作。同样,仅使用并发性,通过基于子树大小的线程之间的“负载均衡”操作,是否可以实现更高的性能?我猜测这可能会提高性能,例如,如果一些零星的叶子需要处理不成比例的类型。但是,如果运营的时间成本缩减,例如,与叶子的数量成线性关系,性能是否会增加? – user2398029 2012-02-13 23:18:36

+1

通常,并发只能帮助你,如果操作被某些外部操作阻止,而不是如果它们花费很多时间。树搜索中所有操作的总时间是一个常量,并且如果您将这些工作在各个线程之间进行混洗,则不太可能有所帮助。 I/O操作变得更快的原因是CPU可以在其他线程的“等待时间”内工作,基本上填补了处理时间的空白。 – templatetypedef 2012-02-14 00:25:08

+0

好的,这就是我的想法 - 非常感谢。 – user2398029 2012-02-14 00:28:22

0

Ruby模型运行良好的一种情况是当您使用Ruby驱动其他应用程序时。例如,如果你产生了,比如编译,你可以让一个Ruby线程处理一个外部进程。

另一件好事是,它允许您将应用程序划分为逻辑部分,并让一个线程处理每个部分。这样做只使用一个线程可能会要求您编写更复杂的应用程序。