了解python GIL - I / O绑定与CPU绑定

时间:2014-05-09 21:37:17

标签: python multithreading gil

来自python threading文档

  

在CPython中,由于Global Interpreter Lock,只有一个线程可以   一次执行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

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

  1. 使用requests
  2. 抓取网址
  3. 使用pyv8 javascript库
  4. 分析已删除的html

    据我所知,1是I / O绑定的,2是CPU绑定的。

    这是否意味着,GIL申请了2而我的计划无法正常运作?

1 个答案:

答案 0 :(得分:3)

GIL描述没有说明正确性,只说效率。

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

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