python计算密集型任务_Python 并发性介绍

按照设计,Python 将并发性问题留给了操作系统,而只为操作系统机制提供了一个简单的包装器。Python 字节码直接在单核处理器上运行。一次只执行一个线程。通过获取 GIL,执行中的线程会将其他线程锁在外面。这种简单稳健的设计也使其更容易编写扩展。

当部分线程为 I/O 密集型时,多线程性能保持良好,但是当所有线程为 CPU 密集型时,性能会变差,这对于科学计算来说是个大问题,因为大部分任务都是 CPU 密集型任务。摆脱 GIL 看似微不足道,但做起来并不简单。到目前为止,从 CPython 移除 GIL 的尝试还不是很成功。大部分尝试不是会影响单线程操作模式的性能,就是会破坏与扩展的可兼容性,这两种情况都不是理想的结果。

一种替代方法就是生成进程而不是线程。Python 利用多处理模块实现这项功能。每个进程都有自己的 GIL,因此互不影响。在 Python3 中,这项功能包含在新的 concurrent.futures 模块中。这种方法会有一些开销,但是这样 Python 可以使用多核 CPU 和 CPU 集群。

正如我们前面所见,一些编译器可以围绕一段代码显式释放 GIL。因此,扩展可以在将控件转交给外部库时释放 GIL,并在控件返回至 Python 代码时重新获取。这项功能允许 Python 切换到 C 代码,这种代码可以处理多线程或多处理任务。Python 中的科学编程包(比如 NumPy 和 SciPy)就使用这种方法。

2f77b7d3f7aa2875ec03b260ffad6369.png

扫码关注

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值