【问题标题】:How coroutines can be faster than threads?协程如何比线程更快?
【发布时间】:2017-11-03 09:36:08
【问题描述】:

我试图找到一种情况,将多线程更改为协程将加快受影响代码部分的处理速度。据我发现协程与线程相比使用更少的 CPU 和堆空间,我仍然找不到协程比线程快的情况。虽然我知道协程创建和上下文切换比使用线程的相应操作要便宜得多,但我在速度差异方面得到了难以察觉的结果(如果不测量线程创建,两种情况都将完全一样)。

那么,是否有可能找到协程比线程更快执行的情况?

【问题讨论】:

  • 需要注意的一点是,当你有很多很多协程时,协程会非常优越。您可以不加思索地创建和执行数千个协程,如果您尝试通过线程执行此操作,那么与线程相关的所有开销可能会很快杀死主机。因此,这使您能够考虑大规模并行化,而无需管理工作线程和可运行对象。
  • @Robin 请将其发布为答案
  • @Ilya Done,还添加了更多信息。

标签: multithreading performance kotlin coroutine


【解决方案1】:

需要注意的一点是,当您拥有大量的协程时,协程的优势要大得多。您可以不加思索地创建和执行数千个协程,如果您尝试通过线程执行此操作,那么与线程相关的所有开销可能会很快杀死主机。因此,这使您能够考虑大规模并行化,而无需管理工作线程和可运行文件。它们还使实现异步计算模式变得容易,这对于使用基本线程(如通道和参与者)实现非常笨拙。

超出了您的问题的范围,但仍然值得注意的是该概念的通用性,因为协程的用例不仅限于异步计算。协程的核心是可挂起的函数,例如,它还可以启用生成器,就像你在 python 中使用的那样,你不会立即连接到异步编程。

【讨论】:

  • 我同意你的观点,协程比线程有更多的优势,但我认为它们也应该更快一些,因为线程上下文切换或其他一些繁重的操作。我只是好奇将多线程代码的某些工作部分更改为协程选择提高速度是否可行。
  • @Praytic 好吧,在速度方面,改进应该越明显,你拥有的异步任务越多,这些任务本身就越小。因此,如果您在后台线程上进行大量下载,则切换到协程不会在速度方面有太大提升,因为与操作相比,实际线程开销仍然很小。