理解 python GIL - I/O 限制与 CPU 限制

Gir*_*iri 3 python multithreading gil

来自python 线程文档

在 CPython 中,由于全局解释器锁,一次只有一个线程可以执行 Python 代码(尽管某些面向性能的库可能会克服这一限制)。如果您希望您的应用程序更好地利用多核机器的计算资源,建议您使用多处理。然而,如果您想同时运行多个 I/O 密集型任务,线程仍然是一个合适的模型。

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

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
Run Code Online (Sandbox Code Playgroud)

这里w.analyze()做两件事

  1. requests使用库抓取 url
  2. pyv8使用javascript 库分析抓取的 html

据我所知,1是 I/O 限制,2也是 CPU 限制。

这是否意味着,申请了GIL 2,我的程序将无法正常运行?

mer*_*011 5

GIL描述没有提到任何关于正确性的内容,只提到效率。

如果2受 CPU 限制,您将无法从线程中获得多核性能,但您的程序仍将正确执行。

如果你关心CPU并行性,你应该使用Python的multiprocessing库。