python多线程代码运行速度更慢-原因解析

写出了正确的多线程代码,运行速度反而比单线程慢很多,原来是由于GIL(Global Interpreter Lock)!
GIL 是Cpython(Python语言的主流解释器)特有的全局解释器锁(其他解释器因为有自己的线程调度机制,所以没有GIL机制),GIL锁定Python线程中的CPU执行资源。线程在执行代码时,必须先获得这把锁,才获得CPU执行代码指令。如果这把锁被其他线程占用,该线程就只能等待,等到占有该锁的线程释放锁。
在Cpython解释器中,线程要想执行CPU指令需要2个条件:

  1. 被操作系统调度出来(操作系统允许它占用CPU)
  2. 获取到GIL(Cpython解释器允许它执行指令)

如果写出正确的多线程代码,执行的情况就是会有线程满足条件1不满足条件2,这时只能等待。
在单核CPU机器上,多线程与单线程在本质上并无不同,因为所有线程都是轮流占用CPU。多个线程慢于一个线程,因为其他线程还要先调度出来,再等待。
在多核CPU机器上,多线程代码运行性能会非常糟糕,比单核更糟糕。因为这时候多一个步骤,不同的CPU再竞争GIL,GIL只有一个。Python在多核CPU上的多核CPU也只有单线程在跑程序。

可以有哪些解决办法呢?【绕开GIL的影响】

  1. 使用多进程(多进程之间没有GIL限制)
  2. 使用Jython, IronPython等无GIL的解释器
  3. 使用协程(高效的单线程模式)

GIL的设置有其优点和可取之处,在Cpython解释器框架之下难以绕过这一限制。可以用PyPy解释器,麻烦之处在于很多第三方库在PyPy下无法使用,或者重新安装第三方库的PyPy版本。运行时候,PyPy **.py即可。Cpython下是Python **.py。
I/O的多线程还是快于单线程,因为优先级在获取GIL之上,I/O并行运算的时候,GIL处于release状态。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python多线程可以用于域名解析服务器。通过使用多线程,可以同时处理多个域名解析请求,提高服务器的并发性能。 在Python中,可以使用`subprocess`模块来运行命令行命令。例如,可以使用`nslookup`命令来进行域名解析。下面是一个示例代码: ```python import subprocess def resolve_domain(domain): print('$ nslookup', domain) result = subprocess.call(\['nslookup', domain\]) print('Exit code:', result) domains = \['www.example.com', 'www.google.com', 'www.microsoft.com'\] for domain in domains: resolve_domain(domain) ``` 这段代码会依次解析`www.example.com`、`www.google.com`和`www.microsoft.com`这三个域名,并打印出解析结果。 注意,由于Python解释器的全局锁(GIL)的存在,多线程Python中无法充分利用多核处理器。如果需要更好的并发性能,可以考虑使用多进程来处理域名解析请求。可以使用`multiprocessing`模块来实现跨平台的多进程功能。 希望以上信息对您有帮助。 #### 引用[.reference_title] - *1* *2* [python多线程](https://blog.csdn.net/m0_37864814/article/details/89522595)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v4^insert_chatgpt"}} ] [.reference_item] - *3* [Python 实现子域名查询与爆破](https://blog.csdn.net/lyshark_csdn/article/details/127191060)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v4^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值