例1 使用多线程提高响应速度
假设我们有一个类似计算器的服务,输入数字公式,返回相应的结果,如果无解,返回“NULL\r\n”。
假设小明在很短的时间内发出10个请求,如果用单线程来一个处理一个,那么这些请求会在队列里依次处理。假设一个请求响应时间是10ms,那么第二个请求响应时间将会为20ms(等第一个请求执行完才执行第二个)。那么第十个请求响应时间为100ms。那么这10个请求的平均响应时间为55ms。
ok,采用多线程:1个主线程,10个计算线程。主线程将请求分别分配给10个计算线程,那么这10个请求的平均响应时间将为10ms。很显然,比单线程快了不少。
例2 IO和“计算”相互重叠
基本思路:无论是磁盘IO还是网络IO,只要涉及到IO,那都是比较慢的,那么就可以将IO操作交给别的线程去去做,自己不必久等待。
采用同步方式会降低性能,因为:
- 文件操作比较慢,服务器会等在IO上,此时CPU闲置,增加响应时间。
- 如果用buffer。多线程一起写,为了保证线程安全,要加锁。加锁会让多个线程互相等待,降低并发性。
解决方法:单独开一个线程来负责写磁盘文件。别的线程写日志,只需要将消息准备好,然后交给queue,基本不用等待,降低了服务器响应时间