【问题标题】:Understanding python GIL - I/O bound vs CPU bound理解 python GIL - I/O bound vs CPU bound
【发布时间】:2014-05-09 21:37:17
【问题描述】:

来自python threading 文档

在 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()做两件事

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

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

是不是说,GIL 申请了2,我的程序就不能正常运行了?

【问题讨论】:

  • 我会在这里检查一个假设。我认为requests 受 CPU 限制,或者至少它会锁定其线程,直到请求完成。对于支持回调的库,我会查看requests-futures
  • 这是不正确的。 requests(和 urllibhttplib2 等)都非常受 I/O 限制。 threading 加快所有速度。
  • @Huu 仅仅因为某些东西锁定了线程并不意味着它受 CPU 限制。如果您将sleep(1000) 放入线程中,该线程将被阻塞一段时间,但它不会做任何工作,并且会在其间释放 GIL。任何其他类型的 IO 请求也是如此。

标签: python multithreading gil


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-07-15
    • 2011-04-14
    • 1970-01-01
    • 2010-11-20
    • 2022-01-10
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    相关资源
    最近更新 更多