python 为什么io密集要用多线程

IO传输过程分为:发送消息,等待返回消息。python多线程在处理io的时候,一个线程获得GIL发送消息,然后等待返回消息(阻塞),python此时释放GIL, 其他线程得到GIL发送消息,然后同样等待返回消息(阻塞)......,这样保证了IO传输过程时间的合理利用,提高io传输效率。

但是多核下,多核多线程比单核单线程更差,原因是单核下多线程,每次释放GIL唤醒的那个线程都能获得GIL锁,能够无缝执行,但多核下,CPU释放GIL后,其他CPU上的线程都会进行竞争,但GIL可能被CPU0拿到,导致其他几个CPU上被唤醒的线程会醒着等待到切换时间后又进入待调度状态,这样会造成线程颠簸,导致效率更低。

【所以多线程适合单核IO密集型】

为了高效利用多核,python引入多进程(原因是,每个进程有自己独立的GIL,互不干扰,这样就可以真正意义上的并行执行,所以在python中,多进程的执行效率优先于多线程(仅仅对多核cpu而言))

所以在这里说结论:多核下,想做并行提升效率,比较通用的方法是使用多进程,能够有效提高执行效率。

【另外,在逻辑功能比较多的程序中,为了防止主程序被挂起,其他的功能需被封装为函数让线程去开启(开多个),其中一个功能阻塞,其他的也能运行下去】

参考自:静觅 » Python爬虫进阶五之多线程的用法

猜你喜欢

转载自blog.csdn.net/qq_32446743/article/details/80262572