有许多解决方案旨在实现“用户空间”线程。无论是 golang.org 的 goroutines、python 的绿色线程、C# 的 async、erlang 的进程等。这个想法是允许并发编程,即使是单个或有限数量的线程。
我不明白的是,为什么操作系统线程如此昂贵?在我看来,无论哪种方式,您都必须保存任务(操作系统线程或用户线程)的堆栈,这是几十 KB,并且您需要一个调度程序来在两个任务之间移动。
操作系统免费提供这两个功能。为什么操作系统线程比“绿色”线程更昂贵?每个“任务”都有一个专用的操作系统线程导致假定性能下降的原因是什么?
请您参考如下方法:
我想修改都铎王朝的答案,这是一个很好的起点。线程有两个主要开销:
(1) 只有当您一直在创建和停止它们时才会出现问题。这通常使用线程池来解决。我认为这个问题实际上已经解决了。在线程池上调度任务通常不需要访问内核,这使得它非常快。开销是一些互锁的内存操作和一些分配的顺序。
(2) 只有当您有很多线程(> 100 左右)时,这才变得重要。在这种情况下,异步 IO 是一种摆脱线程的方法。我发现如果你没有疯狂的线程数量,包括阻塞在内的同步 IO 比异步 IO 稍快(你没看错:同步 IO 更快)。