协程如何比线程更快?

3
我正在尝试找到一种情况,即将多线程更改为协程能够加速所影响的代码部分的处理。尽管我发现协程相比线程使用更少的CPU和Heap空间,但我仍然找不到协程比线程更快的情况。虽然我知道协程的创建和上下文切换比线程的相应操作要便宜得多,但是我在速度差异方面得到了微不足道的结果(如果不测量线程创建,两种情况将完全相同)。
那么,有没有可能找到一种情况,使得协程比线程执行更快呢?

4
需要注意的一点是,当你有很多协程时,协程会比线程更加优越。你可以创建和执行成千上万个协程而不用考虑太多,如果你试图通过线程来实现这一点,所有与线程相关的开销可能会迅速消耗主机资源。因此,这使得你可以考虑大规模并行化,而无需管理工作线程和可运行对象。 - Robin
@Robin 请将其发布为答案。 - Ilya
@Ilya完成,还添加了一些更多的信息。 - Robin
1个回答

4

需要注意的一点是,当你有大量的协程时,协程的优势是显而易见的。你可以创建和执行成千上万个协程而毫不费力,如果你试图通过线程来实现这一点,线程带来的所有开销可能会迅速消耗机器资源。因此,使用协程使你能够考虑大规模并行化,而无需管理工作线程和运行任务。它们还使得实现异步计算模式变得容易,这在基本线程中非常难以实现,比如通道和执行者。

关于你的问题超出范围,但仍值得注意的是这个概念的泛化性,因为协程的用例不仅限于异步计算。协程的核心是可挂起函数,例如它也可以像Python一样启用生成器,这与异步编程的联系不太直接。


我同意你的观点,协程比线程更有优势,但我认为它们也应该更快一些,因为线程上下文切换或其他重型操作。我只是好奇是否可行将多线程代码的某些工作部分更改为协程以提高速度。 - Praytic
1
@Praytic 嗯,在速度方面,改进应该越明显,异步任务越多,并且这些任务本身越小。因此,如果您正在后台线程上执行某个大型下载,那么切换到协程不会在速度上带来太多改进,因为实际的线程开销与操作相比仍然很小。 - Robin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接