理解pythongil-I/O绑定与CPU绑定

理解pythongil-I/O绑定与CPU绑定,python,multithreading,gil,Python,Multithreading,Gil,从文件 在CPython中,由于全局解释器锁,只有一个线程可以 立即执行Python代码(即使某些面向性能 库可能会克服此限制)。如果你想要你的 应用程序以更好地利用 多核机器,建议您使用多处理。然而, 如果要运行多个线程,线程仍然是合适的模型 同时执行I/O绑定任务 现在我有一个像这样的线程工人 def worker(queue): queue_full = True while queue_full: try: url = queue.

从文件

在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
这里
w.analyze()
做两件事

  • 使用
    请求
    库刮取url
  • 使用
    pyv8
    javascript库分析刮取的html
  • 据我所知,
    1
    是I/O绑定,
    2
    是CPU绑定


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

    GIL
    的描述没有说明任何正确性,只说明了效率

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


    如果您关心CPU并行性,那么应该使用Python的
    多处理库。

    我会在这里检查一个假设。我认为
    请求
    受CPU限制,或者至少它会锁定线程,直到请求完成。对于具有回调功能的库,我会签出。这是错误的<代码>请求(以及
    urllib
    httplib2
    等)都是非常受I/O限制的<代码>线程化
    加快了所有线程的速度。@Huu仅仅因为有东西锁定了线程并不意味着它是CPU受限的。如果将
    sleep(1000)
    放入一个线程,该线程将被阻塞一段时间,但它不会做任何工作,并将在其间释放GIL。任何其他类型的IO请求也是如此。