![]() |
1
3
用你的原始代码,你有一个 线 每个CPU核心,但你的goroutines比线程多。这很正常:Go运行时内部任务在不涉及内核调度器的情况下在goroutines之间切换,在等待I/O时停止一个goroutines并切换到另一个。如果一个任务99.999%在等待网络资源,0.001%在等待CPU,那么一个CPU核一次可以轻松处理1000000个goroutine——你需要足够的内存来分配堆,网络协议需要足够的延迟容忍度,这样如果goroutine需要一些时间来调度(以及如果你的连接需要 相同的 服务器,它需要愿意处理这种负载),但只要你 有 内存和远程服务(以及中间的网络堆栈)与客户端代码一样健壮,你很好。(HTTP/2支持多路复用,在单个TCP连接上运行无限数量的请求——希望您在这里使用它)。 当你引入一个只有CPU内核那么多插槽的信号量时 ,你完全击败了这一功能:现在,你不能一次平衡数千个请求(通过处理已准备好的请求并停放未准备好的),而是放慢了代码的速度,只处理与CPU内核数量一样多的请求。 当然 速度较慢;怎么可能不是呢? |
|
2
0
Goroutine不是线程或进程。 这接近于一个协程。 因此,即使你使用了数千个goroutine,也没有负担,这远远超过了CPU内核的数量。 然而,如果你最终使用了太多的goroutines,可能有必要提出它们。 例如,限制对资源的同时访问等。。。 在这种情况下,建议使用golang.org/x/sync/errgroup包。在内部,使用互斥体控制最大数量。 |
![]() |
arkham knight · 使用信号量的线程同步 7 年前 |
![]() |
K.Miao · 其他进程不会使用信号量唤醒 7 年前 |
|
Akhil V · 生产者消费者C中的细分错误 7 年前 |
![]() |
Dark Inspiration · 信号和互斥行为怀疑 9 年前 |
![]() |
sheikh_anton · 选择共享内存或unix信号量键的惯用方法 9 年前 |
|
user5134749 · 同步:线程以相同的顺序执行两个关键部分 9 年前 |
![]() |
Zhang Biao · 如何在FreeRTOS中使用互斥锁? 9 年前 |