理解Python GIL - I/O绑定与CPU绑定

3 投票
1 回答
5038 浏览
提问于 2025-04-18 06:03

来自Python线程的文档

在CPython中,由于有一个叫做全局解释器锁(GIL)的东西,只有一个线程可以同时执行Python代码(尽管某些专门优化性能的库可能会绕过这个限制)。如果你想让你的应用程序更好地利用多核机器的计算资源,建议使用多进程。不过,如果你想同时运行多个与输入输出相关的任务,使用线程仍然是合适的选择。

现在我有一个线程工作者,像这样

def worker(queue):
    queue_full = True
    while queue_full:
        try:
            url = queue.get(False)
            w = Wappalyzer(url)
            w.analyze()
            queue.task_done()

        except Queue.Empty:
            queue_full = False

这里的w.analyze()做了两件事

  1. 使用requests库抓取网址
  2. 使用pyv8 JavaScript库分析抓取的HTML

据我所知,1是与输入输出相关的,而2是与CPU相关的。

这是否意味着,全局解释器锁会影响2,导致我的程序无法正常工作?

1 个回答

5

GIL的描述并没有提到正确性,只是说了效率。

如果你的程序是CPU密集型的,也就是说它主要依赖于处理器的计算能力,那么使用线程是无法充分利用多核处理器的,但你的程序依然会正确地运行。

如果你想要充分利用CPU的并行处理能力,应该使用Python的multiprocessing库。

撰写回答