6

据我所知,multi-threading在大多数情况下(但不是全部)驱动编程的是性能因素。(无论是 Java 还是 Python)。

我正在阅读这篇关于SO 的启发性文章。GIL文章总结python采用GIL机制;即只有 asingle Thread可以python byte code在任何给定时间执行。这使得single thread应用程序真的更快。

我的问题如下:

如果Thread在给定点只提供一个服务,那么模块multiprocessing是否thread提供了一种方法来克服 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

4 回答 4

12

GIL 是对的,没有必要使用多线程来进行 CPU 密集型计算,因为 CPU 只会被一个线程使用。

但是前面的陈述可能启发了您:如果您的计算不受 CPU 限制,您可以利用多线程。

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

非 CPU 绑定程序的众多示例之一:假设您要构建一个网络爬虫,您必须爬取许多网站,并将它们存储在数据库中,花费多少时间?等待服务器发送数据,实际下载数据,并将其存储在数据库中,这里没有 CPU 绑定。在这里,您可能会使用一组爬虫而不是一个爬虫来获得更快的爬虫。通常情况下,如果一个网站几乎关闭并且响应速度非常慢(约 30 秒),在此期间,单线程应用程序将等待该网站,您会被卡住。在多线程应用程序中,其他线程会继续爬行,这很酷。

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

作为旁注,它或多或少存在一些没有 GIL 的 Python 部分实现,我想提一个我认为可以很好地实现很酷的东西的方法:pypy STM。你会很容易找到,搜索“摆脱 GIL”很多关于这个主题的线程。

于 2014-07-14T20:00:52.043 回答
2

多处理避开了 GIL 问题,因为代码在单独的进程中运行,而 GIL 只关注单个进程。在一个进程中,多线程可能会更快,因为线程正在等待一些相对较慢的资源,如磁盘或网络。

于 2014-07-14T19:55:53.293 回答
1

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

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

于 2014-07-14T20:11:49.823 回答
1

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

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

最后,如果您想利用多个 CPU 来提高纯数字运算的性能,并且以 Python 风格,请使用多处理。

但它仍然不如在汇编中编写多线程应用程序快。祝你好运不打错字。

于 2014-07-14T20:14:25.160 回答