python中的多线程:大部分时间它是否真的具有高效性?

时间:2014-07-14 19:51:57

标签: python multithreading multiprocessing gil

在我的理解中,在大多数情况下,驱动multi-threading编程的性能因素并非全部。 (无论Java还是Python)。

我在SO GIL上正在阅读此enlightening article。文章总结了python采用GIL机制;即只有single Thread可以在任何给定时间执行python byte code。 这使得single thread应用程序真的更快。

我的问题如下:

由于在给定点只提供一个Threadmultiprocessingthread模块是否提供了克服GIL强加的限制的方法?如果没有,它们为进行真正的multi-task工作提供了哪些功能

在接受的答案中,上述帖子的评论部分提出了一个问题,但没有回答?我脑子里也有这个问题

^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 个答案:

答案 0 :(得分:9)

你是关于GIL的,没有必要使用多线程来进行CPU绑定计算,因为CPU只能由一个线程使用。

但是之前的陈述可能会引起你的注意:如果你的计算不受CPU限制,你可以利用多线程。

一个典型的例子是当你的应用程序花费大部分时间等待某事时。

许多非CPU绑定程序的例子之一: 假设您要构建一个Web爬虫,您必须抓取许多网站,并将它们存储在数据库中,成本倍数是多少?等待服务器发送数据,实际下载数据,并将其存储在数据库中,这里没有任何CPU绑定。在这里,您可以使用爬虫池而不是单个爬虫来获得更快的爬虫。通常情况下,一个网站几乎停机且响应速度很慢(~30秒),在此期间,单线程应用程序将等待网站,您将被卡住。在多线程应用程序中,其他线程将继续爬行,这很酷。

另一方面,由于每个进程有一个GIL,您可以使用多处理来进行CPU绑定计算。

作为旁注,它存在一些或多或少部分没有GIL的Python部分实现,我想提一个我认为很好地实现一些很酷的方法:pypy STM。您可以轻松找到,搜索"摆脱GIL"关于这个主题的很多线索。

答案 1 :(得分:2)

多处理侧面处理GIL问题,因为代码在单独的进程中运行,而GIL仅涉及单个进程。在一个进程中,多线程可能会更快到线程正在等待磁盘或网络等相对较慢的资源。

答案 2 :(得分:1)

快速谷歌搜索产生了这个信息丰富的幻灯片。 http://www.dabeaz.com/python/UnderstandingGIL.pdf

但是它未能向它展示所有线程都包含在进程中的事实。默认情况下,进程只能在一个CPU(或核心)上运行。因此,虽然基于每个进程的GIL确实管理了所述进程中的线程并且并不总是提供预期的性能,但它应该在大规模上比单线程操作执行得更好。

答案 3 :(得分:1)

GIL一直是python中的热门话题,但通常毫无意义。它使大多数程序更安全。如果您想要真正的计算性能,请尝试PyOpenCL。任何现代的真实世界高性能数字运算都应该在GPU上完成(openCL也可以在CPU上运行)。它没有GIL问题。

如果你想在python中进行多线程处理以提高I / O绑定性能,那么GIL不是问题。

最后,如果您想利用多个CPU来提高纯数字运算的性能,并采用pythonic方式,请使用多处理。

但它仍然没有在汇编中编码多线程应用程序那么快。祝你好运没有拼写错误。