社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
io密集型任务,一般情况下,io有发送数据(output)和返回数据(input)两个过程。就是发送消息,等待返回消息。python多线程在处理io的时候,一个线程获得GIL发送消息,然后等待返回消息(阻塞),python此时释放GIL, 其他线程得到GIL发送消息,然后同样等待返回消息(阻塞)......,这样保证了IO传输过程时间的合理利用,提高io传输效率。
关于GIL的工作方式:https://blog.csdn.net/zshluckydogs/article/details/81986649
由于python在用cpu执行计算任务的时候,GIL锁不会被释放,python多线程其实还是使用的单核在进行cpu计算。一个cpu时间片只会分给一个线程,因此,cpu密集型的情况下,多线程并不会加快计算速度。
但是多核下,多核多线程比单核单线程更差,原因是单核下多线程,每次释放GIL唤醒的那个线程都能获得GIL锁,能够无缝执行,但多核下,CPU释放GIL后,其他CPU上的线程都会进行竞争,但GIL可能被CPU0拿到,导致其他几个CPU上被唤醒的线程会醒着等待到切换时间后又进入待调度状态,这样会造成线程颠簸,导致效率更低。
关于现车颠簸:https://blog.csdn.net/pianistOfSoftware/article/details/51939736
所以多线程适合单核IO密集型任务。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!