关于python中的GIL

Aru*_*lan 7 python django web-services gil

我知道 GIL 会阻止 python 跨内​​核运行其线程。如果是这样,为什么在网络服务器中使用 python,youtube、instagram 等公司如何处理它。

PS:我知道像多处理这样的替代方法可以解决它。但是,如果有人可以将其与他们处理的场景一起发布,那就太好了。

Gia*_*zzi 5

Python 用于网络服务器中的服务器端处理,但(通常)不用作网络服务器。

在正常设置下:我们有 Apache 或其他网络服务器来处理很多进程(服务器端)(python 通常使用 wsgi)。注意通常 apache 直接处理“静态”文件。因此,我们有一台 apache 服务器、许多并行 apache 进程(用于处理连接和基本 http)和许多每次处理一个连接的 python 进程。

每个这样的进程都是相互独立的(它们只是使用相同的资源),因此您可以轻松地对服务器端部分进行编程,而不必担心死锁。这主要是一种权衡:代码的性能,以及轻松快速地生成代码而不会出现大问题。但通常使用 python 的网络服务器规模非常好(也在大型网站上),而且服务器比程序员便宜。

注意:流程中只有一个请求也可以提高安全性。


Dan*_*uez 1

GIL 存在于 CPython 中(用 C 语言制作且最常用的 Python 解释器),其他解释器版本如JythonIronPython没有这样的问题,因为它们没有 GIL。

\n\n

尽管如此,使用 CPython 你仍然可以拥有并发性,只需在 C 中做你的事情,然后在你的 Python 代码中“链接它”,就像 Numpy 或类似的那样。

\n\n

另一件事是,即使你的页面使用 Flask 或 Django,当你在生产服务器中设置它时,你有一个 Apache 或 Nginx 等,它们有一个真正的电荷平衡器(或负载平衡器,我不记得了)现在是英文名称)可以同时向许多人提供页面。

\n\n

从 Flask 文档(链接)获取:

\n\n
\n

Flask\xe2\x80\x99s 内置服务器不适合生产,因为它\xe2\x80\x99t 不能很好地扩展,并且默认情况下一次仅服务一个请求。\n [...]

\n\n

如果您想将 Flask 应用程序部署到此处未列出的 WSGI 服务器,请查找有关如何使用 WSGI 应用程序的服务器文档。请记住,您的 Flask 应用程序对象是实际的 WSGI 应用程序。

\n
\n