当一个系统需要并发的时候,就需要用的多线程/多进程
曾经我在面对redis的设计上,犹豫了,redis靠i/o复用一样实现高吞吐。
那么在什么情况下,需要多线程呢? 提高响应速度。
这里首先来分析一下redis的缺点,假如redis在执行一个非常耗时的操作,比如说union,那么晚于union 的命令都要被堵塞,直到这个命令处理完,才能被处理。
这里就是一个需要用到多线程的地方,假如redis的处理方是多线程的,一个线程的堵塞,并不会影响别的线程,虽然这样也会增加很多线程间互斥的开销。
接着讲几种模型,半同步半异步的网络模型,几乎都是一个线程/进程用于监听,accept,或者有一个锁,抢到的进程,就拥有处理权。
先简单对比一下:
多进程优点:进程增减容易,进程互不干扰可以专心干自己的事情,效率高些,调试起来也方便些
多进程缺点:进程数大于cpu核数,又比较繁忙,导致频繁进行上下文切换会严重降低整体效率
多线程优点:上下文切换问题没那么严重,线程间可以方便地共享数据
多线程缺点:共享数据的时候需要小心,坑多,会增加一定代码复杂度个人倾向于一般尽量采用多进程,轻松舒服。
当涉及较多同步阻塞操作时,或者不得不需要较多实例时考虑多进程。