Python中的多线程:大多数情况下真的效率高吗?

7 投票
4 回答
6391 浏览
提问于 2025-04-18 19:01

根据我有限的理解,通常情况下,编程中使用多线程主要是为了提高性能,但并不是所有情况都是这样(无论是Java还是Python)。

我在阅读这篇关于全局解释器锁(GIL)文章时,发现了一些有趣的内容。文章总结说,Python采用了GIL机制,也就是说,在任何时候只有一个线程可以执行Python字节码。这使得单线程的应用程序运行得非常快。

我有一个问题:

既然在某个时刻只能有一个线程在工作,那么多进程线程模块是否提供了克服GIL限制的方法?如果没有,它们提供了什么功能来实现真正的多任务处理呢?

在上面帖子评论区有人问了这个问题,但没有人回答。我心里也有同样的问题。

^so at any time point of time, only one thread will be serving content to client... 
so no point of actually using multithreading to improve performance. right?

4 个回答

1

GIL在Python中总是一个热门话题,但其实大多数时候没什么实际意义。它让大部分程序更加安全。如果你想要真正的计算性能,可以试试PyOpenCL。现在的高性能计算大多应该在GPU上进行(而且OpenCL也可以在CPU上运行)。这样就不会有GIL的问题。

如果你想在Python中使用多线程来提高I/O操作的性能,GIL就不是问题了。

最后,如果你想利用多个CPU来提升纯计算的性能,并且想用Python的方式来实现,可以使用多进程。

不过,这样的速度还是比不上用汇编语言编写多线程应用程序。祝你好运,不要打错字哦。

1

快速在网上搜索了一下,找到了这个很有用的幻灯片。http://www.dabeaz.com/python/UnderstandingGIL.pdf

不过,它没有提到一个重要的事实,那就是所有的线程都是在一个进程里面的。而一个进程默认只能在一个CPU(或者说核心)上运行。所以虽然GIL(全局解释器锁)在每个进程中管理这些线程,并不总是能提供预期的性能,但在大规模的情况下,它的表现通常会比单线程操作要好。

2

多进程可以绕过GIL的问题,因为代码是在一个单独的进程中运行的,而GIL只关心单个进程。在一个进程内部,如果有多个线程在运行,当这些线程在等待一些比较慢的资源,比如磁盘或网络时,使用多线程可能会更快。

13

你说得对,GIL(全局解释器锁)确实让多线程在进行CPU密集型计算时没什么意义,因为CPU只能被一个线程使用。

不过,前面的说法可能让你明白了:如果你的计算不是CPU密集型的,那就可以利用多线程。

一个典型的例子是,当你的应用程序大部分时间都在等待某些事情时。

有很多不是CPU密集型程序的例子:比如说你想做一个网络爬虫,你需要爬取很多网站,并把它们存储到数据库里。什么地方耗时呢?就是在等服务器发送数据、实际下载数据和把数据存到数据库里,这里并没有什么CPU密集型的操作。在这种情况下,使用多个爬虫会比用一个单独的爬虫更快。比如说,有一个网站几乎崩溃,响应非常慢(大约30秒),在这段时间里,单线程的应用程序会一直在等这个网站,你就卡住了。而在多线程的应用程序中,其他线程可以继续爬取其他网站,这样就很不错了。

另一方面,由于每个进程只有一个GIL,你可以使用多进程来进行CPU密集型计算。

顺便提一下,确实有一些部分实现的Python版本是没有GIL的,我想提到一个我认为很有前途的项目:pypy STM。你可以通过搜索“摆脱GIL”找到很多关于这个话题的讨论。

撰写回答