Python在并发编程中是个严肃的选择吗

6 投票
7 回答
5942 浏览
提问于 2025-04-15 18:34

我正在考虑开始学习Python,但在投入更多时间之前有一个担忧。让我先说一个观点,然后再说说我的担忧,希望大家能评论一下,因为这个观点的假设可能不太准确:

我了解到GIL(全局解释器锁),大家的共识似乎是,如果你需要在Python中实现并发解决方案,最好的办法是创建一个新的进程来避免GIL的影响。

我的担忧是,如果我有一个问题想要在N个处理器上分成N*2个部分(假设我有一台运行*nix操作系统的服务器,拥有8个核心),那么在进程之间切换会比在线程之间切换更耗时,这样会影响性能。

我之所以这样问,是因为还有其他语言声称在这种情况下表现更好,我想知道Python是否适合这种需求。

7 个回答

3

根据我有限的经验,"上下文切换的成本"被过分夸大了,作为性能的限制。

输入输出带宽和内存是最常见的限制因素。Python的输入输出性能和很多其他语言差不多,因为它基本上直接使用了标准的C库。

你遇到的问题可能并不典型。不过,很多问题在多进程模式下表现得很好,因为它们实际上是受输入输出限制的。通常是文件系统、网页读取或者数据库操作在性能上限制得比上下文切换要早得多。

15

multiprocessing 是一个可以帮助我们绕过全局解释器锁(GIL)的问题的工具,但它也带来了自己的麻烦,比如进程之间的沟通问题。

8

Python在处理需要大量计算的并发编程时表现得不是很好。因为有个叫做GIL的东西,它会让你的程序运行得像是在单核处理器上一样,甚至更糟。就算是Unladen Swallow这个项目,也可能无法完全解决这个问题(他们在项目计划中提到:“我们对完全去掉GIL的可能性不再那么乐观”)。

正如你所说,其他编程语言在并发编程方面声称表现更好。比如说,Haskell就自带了处理并发应用的功能。你也可以尝试使用C++和OpenMP,我觉得这样可以让并行处理变得非常简单。

如果你的应用主要是处理输入输出(I/O),那么Python可能是个不错的选择,因为在进行阻塞调用时,GIL通常会被释放。

撰写回答