Python全局解释器锁GIL问题
我想在网上提供一个服务,让人们可以测试一个用Python写的算法的性能,这个算法是在Linux机器上运行的。
基本上,我想做的是,有一个非常简单的PHP处理程序,比如叫做start_algo.php,它可以接受来自浏览器的请求。在PHP代码中,我通过system()或者popen()(类似于exec("python algo.py"))来启动一个新的进程来运行这个Python脚本,我觉得这一部分是可以做到的。
问题是,因为这是一个网络服务,肯定需要同时为多个用户提供服务,但我对全局解释器锁(Global Interpreter Lock,简称GIL)有点困惑。这个锁是Python的标准实现CPython所采用的,http://wiki.python.org/moin/GlobalInterpreterLock。它的意思是,如果现在有3个用户在运行这个算法(也就是说有3个独立的进程,对吧?如果我错了请纠正我),在某个特定的时刻,只有一个用户在被Python解释器服务,而另外两个用户则在等待他们的轮到吗?
非常感谢!
Ted
2 个回答
7
GIL是按进程来划分的。 如果你启动多个python
进程,每个进程都有自己的GIL,这个GIL会限制该进程中的解释器一次只能运行一个线程。不过,不同的进程可以同时运行。
另外,在一个Python进程内部的多个线程是轮流运行的(我记得大概是每执行一百条指令或者几毫秒就会切换一次),所以GIL并不是完全阻止并发的,它只是限制了多线程的同时运行。
10
如果你是通过启动一个新进程来打开每个脚本,那么你就不会遇到GIL的问题。每个进程都有自己的解释器,所以也就有自己的解释器锁。