采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
我看到您课程性能是用select和同步比较,这种差距很大;用select跟多线程比较会不会突出一些,差距也很大吗?
要看具体情况吧;
首先,两者是一种解决并发问题的实现方式。如果是一套简单的程序,从用户线程角度看其实最终得出的结果 多线程也是能实现多路复用的一套模型。但多路复用从基本概念上,确实要比多线程来的要好,比如没有了多线程的上下文切换,和CPU时间片竞争。
但也并不是说多路复用就完全比多线程要好。一切要看实际,并不是一个简单的几行代码的小程序就能代表的。
如果你的用户线程计算比较单一,比较简单,你线程池核心线程配出花来,也不会对整个进程有个很有效的提高,因为CPU在你的用户线程上的cpu时间片占用并不高。而你的程序瓶颈就在io上,这个时候IO多路复用的效果就会体现出来。
但是如果你的用户线程是个计算密集型,那么这个时候需要的是把关注点放在多线程上,因为此时主要影响性能的是你的cpu而不是IO。
(这也就是为什么多路复用是redis最好的选择,因为io多路复用+单线程的方式,舍去了多线程的时间片切换以及锁的操作,数据上保证一致性,更是因为redis数据结构比较单一,所以保证了redis能更加合理有效的使用IO多路复用模型)
当然实际情况中,我们不可能2选1这种,毕竟io多路复用和多线程 在我们实际的用户线程中是混合用的。
只是说在定义线程数和线程池的时候,我们更应该多考虑下我们实际的进程瓶颈到底在哪里。而不是说一慢了,就单纯的说增加核心线程数来解决。
如果是计算密集型,那么使用select和多线程都无济于事,因为select和多线程都是解决io问题的,计算密集型是耗cpu的,遇到这种问题要使用多进程利用多核,甚至给电脑加gpu
那肯定select性能高啊, 多路复用异步高并发的关键所在, 肯定性能是高的
登录后可查看更多问答,登录/注册
socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO
1.2k 31
1.1k 24
1.1k 16
1.4k 10
1.1k 9