既然python解释器是单线程的,还有进行多线程编程的必要吗?
程序员文章站
2022-05-13 22:21:44
...
写再多的线程都绕不过解释器是单线程,那不还等于是单线程? 且线程切换消耗,既然这样,python还有必要进行多线程编程吗?
能产生IO阻塞的情况很多,比如网络、磁盘,等等。当发生阻塞时,Python是不耗CPU的,此时如果就一个线程就没法处理其他事情了。所以对于含有IO阻塞的环境。多线程至少有机会让你把一个CPU核心跑到100%。
另一个用处来自于Python的C扩展模块。在扩展模块里是可以释放GIL的。但释放GIL期间不应该调用任何Python API。所以,对于一些非常繁重的计算,可以写成C模块,计算前释放GIL,计算后重新申请GIL,并将结果返回给Python。这样就可以让Python这个进程利用更多的CPU资源。每个Python的线程都是OS级别pthread的线程。利用Python来管理这些线程比在C层级操作pthread更方便。 多线程最开始就不是用来解决多核利用率问题的。
是用来解决IO占用时CPU闲置问题的。
如果你对此有疑问,请复习操作系统相关章节。 推荐多进程,多线程不是Python的菜。或者异步io。 多线程可以用来干解决阻塞问题,可以做事件响应机制(或者类似信号槽的玩意),如果运行瓶颈不在CPU运算而是在IO(网络)上,多线程显然很划算。
觉得线程切换开销大?那协程吧……
觉得GIL不能实质性提高性能?那就多进程吧……
对了,你还可以纯C构建模块,模块内的多线程随便耍,回头能给python交代就行。 那么单核时代的cpu也是单线程的呀?但是为什么不能执行多个任务多个线程呢? 如果你的任务是多线程的,那么必须多线程
例如网络通信,你一边把自己的话输进去,一边收听别人传给你的话
那么至少用两个线程
至于以最快速度来计算的任务,多线程没意义
多进程才有意义,可以利用CPU的多核来搞分布式计算,如一个任务切成4个任务,就在4核同时跑 计算密集型用多进程,IO密集型用python多线程。当然你足够牛逼去GIL也可以… 基本上很少用到的感觉。。
回复内容:
有必要,至少能解决很多IO阻塞问题。能产生IO阻塞的情况很多,比如网络、磁盘,等等。当发生阻塞时,Python是不耗CPU的,此时如果就一个线程就没法处理其他事情了。所以对于含有IO阻塞的环境。多线程至少有机会让你把一个CPU核心跑到100%。
另一个用处来自于Python的C扩展模块。在扩展模块里是可以释放GIL的。但释放GIL期间不应该调用任何Python API。所以,对于一些非常繁重的计算,可以写成C模块,计算前释放GIL,计算后重新申请GIL,并将结果返回给Python。这样就可以让Python这个进程利用更多的CPU资源。每个Python的线程都是OS级别pthread的线程。利用Python来管理这些线程比在C层级操作pthread更方便。 多线程最开始就不是用来解决多核利用率问题的。
是用来解决IO占用时CPU闲置问题的。
如果你对此有疑问,请复习操作系统相关章节。 推荐多进程,多线程不是Python的菜。或者异步io。 多线程可以用来干解决阻塞问题,可以做事件响应机制(或者类似信号槽的玩意),如果运行瓶颈不在CPU运算而是在IO(网络)上,多线程显然很划算。
觉得线程切换开销大?那协程吧……
觉得GIL不能实质性提高性能?那就多进程吧……
对了,你还可以纯C构建模块,模块内的多线程随便耍,回头能给python交代就行。 那么单核时代的cpu也是单线程的呀?但是为什么不能执行多个任务多个线程呢? 如果你的任务是多线程的,那么必须多线程
例如网络通信,你一边把自己的话输进去,一边收听别人传给你的话
那么至少用两个线程
至于以最快速度来计算的任务,多线程没意义
多进程才有意义,可以利用CPU的多核来搞分布式计算,如一个任务切成4个任务,就在4核同时跑 计算密集型用多进程,IO密集型用python多线程。当然你足够牛逼去GIL也可以… 基本上很少用到的感觉。。
上一篇: JavaScript 之 this 详解
下一篇: html中ol标签与li标签的高级应用