看我前边的内容。
总的设计,线程池的线程数保持在核数或2倍以内,不会发生可观的调度开销。
其余的就是架构设计的问题。
一个大并发的服务器,每个客户端连接一个context,连接后在epoll里排队。N个线程在epoll_wait。当所有线程忙起来之后,多余的请求在epoll里排队等待。这就已经能够充分利用核的能力,而且没有太大的线程调度开销。这么点线程,栈开销也不是问题。一切都非常完美,没有协程什么事。
正在得意之中,问题来了:
SendNet(bank,支付请求);
RecvNet(bank,银行回复);
你不知道银行何时回复。线程在这里死等。
多来几个这样的任务,不多的几个线程就全搁这儿了,别人排队等着吧。
那么就想,是否能让任务在这里等待,释放线程让它给别人干活去呢?想了好久。
看过协程那些例子,切换来切换去的,没啥意思,也没联想到我这个需求,直到有一次看到ASIO, 不就是它嘛!
【 在 finlab 的大作中提到: 】
: 协程调度同样有开销。
: 不过现在硬件线程切换核心的成本确实太高。 除了线程切换本身,切换后核心缓存作废影响也很大。
: 所以要硬件和操作系统一起想办法。
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*