永发信息网

为什么有人说 Python 的多线程是鸡肋

答案:2  悬赏:60  手机版
解决时间 2021-02-07 05:54
为什么有人说 Python 的多线程是鸡肋
最佳答案
因为Python的全局解释器锁(Global Interpreter Lock,GIL)强制要求Python只能在一个解释器中进行,也就是说即使你有多个处理器,Python也只能使用其中的一个,线程实际上是在串行运行。如果只有一个处理器,那么Python的线程和其他语言没什么区别,但如果有两个及以上就不同了,其他语言可以使用所有处理器,但Python只能使用一个。
假如在单核处理器中,Python的效率可以达到百分之百,那么在双核处理器中,它的效率只有百分之五十,因为它只能使用一个处理器,另一个是闲置的,效率并没有因为多了一个处理器而得到提高,所以说Python的多线程有点鸡肋。
除非可以去除GIL,否则应该尽量避免使用Python的多线程。
注:另外很多任务是可以用Python的协程来完成的,用协程来代替多线程是个不错的选择
全部回答
差不多是这样子。多线程目前仅用于网络多线程采集, 以及性能测试。 其它的语言也有类似的情况,线程本身的特点导致线程的适用范围是受限的。只有cpu过剩,而其它的任务很慢,此时用线程才是有益的,可以很好平衡等待时间,提高并发性能。 线程的问题主要是线程的安全稳定性。线程无法强制中止,同时线程与主进程共享内存,可能会影响主进程的内存管理。 在python里线程出问题,可能会导致主进程崩溃。 虽然python里的线程是操作系统的真实线程。 那么怎么解决呢?通过我们用进程方式。子进程崩溃后,会完全的释放所有的内存和错误状态。所以进程更安全。 另外通过进程,python可以很好的绕过gil,这个全局锁问题。 但是进程也是有局限的。不要建立超过cpu总核数的进程,否则效率也不高。 简单的总结一下。 当我们想实现多任务处理时,首先要想到使用multiprocessing, 但是如果觉着进程太笨重,那么就要考虑使用线程。 如果多任务处理中需要处理的太多了,可以考虑多进程,每个进程再采用多线程。如果还处理不要,就要使用轮询模式,比如使用poll event, twisted等方式。如果是gui方式,则要通过事件机制,或者是消息机制处理,gui使用单线程。 所以在python里线程不要盲目用, 也不要滥用。 但是线程不安全是事实。如果仅仅是做几个后台任务,则可以考虑使用守护线程做。如果需要做一些危险操作,可能会崩溃的,就用子进程去做。 如果需要高度稳定性,同时并发数又不高的服务。则强烈建议用多进程的multiprocessing模块实现。 在linux或者是unix里,进程的使用代价没有windows高。还是可以接受的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
请问桥接模式下,ADSL猫的质量对网络影响大么
松烟青丝坊发廊地址在哪,我要去那里办事
聚合物4000mAh电池用500毫安充电器几个小时能
小车全险一年多少钱
好又多北川店这个地址在什么地方,我要处理点
如何缩短开机时间,取消开机自检
艾尚甲地址有知道的么?有点事想过去
美国科普作家蕾切尔调查了杀虫剂对生态的破坏
三龙自选超市怎么去啊,有知道地址的么
柯南剧场版第九部里面的那首歌叫什么名字??
时尚名剪城怎么去啊,我要去那办事
ringplus 自动充值 是什么意思
红警2有什么办法让小地图上兵的小点变大些,
青城桃源度假别院在什么地方啊,我要过去处理
以诚为信的意思是什么
推荐资讯
牡丹鹦鹉bb吃了一点墨鱼骨粉慢慢就死了,是啥
中北大学软件工程分数线
在大智慧经典版中,求ddx,ddy,ddz指标公式源
蓝调时尚烫染地址在什么地方,想过去办事
以下关于洛可可建筑风格特征,说法错误的是()
请问,公司内部股权溢价转让,需要做增资吗
苏州市林红工艺绣品厂怎么去啊,有知道地址的
解方程组2/x-2y=-9/2 x-y/2=-9
珠海拱北家庭式养生保健会所哪里有技师年轻些
抚琴街道光荣小区在什么地方啊,我要过去处理
怎么样才能发挥我电脑主机的最好性能,主要是
【shortcomings】shortcomings的反义词是什么
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?