Python全局解释器锁GIL问题

3
我希望提供一个网络服务,让用户可以测试在Linux机器上运行的Python编写的算法的性能。基本上,我想做的是,在非常简单的PHP处理程序(例如start_algo.php)中接受来自浏览器的请求,并通过system()或popen()(类似于exec("python algo.py"))在php代码中发出运行Python脚本的新进程。我认为这一部分是可行的。
问题在于,由于它是一个Web服务,肯定必须同时为多个用户提供服务,但我对CPython实现的全局解释器锁GIL感到困惑,详情请看http://wiki.python.org/moin/GlobalInterpreterLock。这是否意味着,如果现在有3个用户正在运行算法(这意味着有3个独立的进程,如果我错了,请纠正我),在特定时刻,只有一个用户正在被Python解释器服务,而其他2个则在等待他们的轮次?
提前致谢
Ted

你是否正在使用Apache和mod_wsgi?如果是,那么并发请求在Python之外的层面上得到很好的处理。如果不是,请解释为什么不使用Apache(或nginx)和mod_wsgi。 - S.Lott
@S.Lott 谢谢,但问题不在于并发请求,而在于同时运行Python脚本,因为这些脚本需要很长时间才能运行,而PHP代码只需在发出“python algo.py”命令后返回。 - Ted Xu
这个问题混淆了并发请求和每个请求运行脚本。这个问题很令人困惑。每当你在Apache和mod_wsgi的上下文中提到GIL时,你必须解释清楚你认为正在发生什么。Apache分离请求。每个请求fork一个单独的进程。请明确表明您理解Apache和mod_wsgi使每个请求(通过分离)实际提交了一个单独的子进程。请在问题中非常清楚地表明您理解这一点。 - S.Lott
2个回答

10

如果您通过调用新进程来打开每个脚本,则不会违反GIL。每个进程都有自己的解释器,因此具有自己的解释器锁。


非常感谢,速度很快,也很有帮助。基于进程的GIL模型对我来说很有意义。 - Ted Xu

7
GIL是按进程分配的。如果启动多个python进程,每个进程都有自己的GIL,防止该进程中的解释器同时运行多个线程。但是,独立的进程可以同时运行。
此外,在一个Python进程内部的多个线程会轮流运行(根据版本不同,频率通常为100条操作码指令或几十毫秒一次),因此GIL并不完全阻止并发-它只是防止了多线程

非常感谢您,delnan,提供了如此详细的解释。在提问之前,我应该做更多的功课。类似的问题已经在这个网站上被问过了。 - Ted Xu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接