当前位置: 首页 > 面试题库 >

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

空浩淼
2023-03-14
问题内容

来自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

这里w.analyze()做两件事

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

据我所知,1是受I / O约束和2CPU约束的。

这是否表示已申请GIL 2,但我的程序无法正常运行?


问题答案:

GIL描述没有提及任何正确性,仅涉及效率。

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

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



 类似资料:
  • 问题内容: 我正在研究Zeromq作为Java项目中的消息传递解决方案,但是我发现有关Java绑定的说明有些难以遵循。 http://www.zeromq.org/bindings:java 我不熟悉Java绑定,所以这些可能是愚蠢的问题,但是有人可以帮助我理解: 为什么我需要安装任何东西? 我在一台机器上构建的jar可以在另一系统上运行吗?我需要此应用程序具有可移植性。 如果是这样,为什么我需要

  • 我试图理解如何以及何时使用编程,并了解I/O绑定操作,但我并不理解它们。我想从头开始实施它们。我怎么能那么做? 考虑下面的同步示例: 如何实现版本,只使用普通的同步方法,而不使用,因为这将使用线程池中的线程进行等待--这太浪费了! 基本上,我必须使用“p/invoke interop调用到本地网络库”...但怎么做?

  • 当我按Ctrl+I时,一个制表符会插入到编辑器中(如果焦点在编辑器中)。当我按Ctrl+Shift+I时也会发生这种情况,这恰好是我最喜欢的签入内容的快捷方式。

  • 问题内容: 该蟒蛇线程 文档指出“......线程仍然是一个合适的模型,如果你想同时运行多个I / O密集型任务”,这显然是因为I / O密集型进程能够避免GIL是在并行执行的线程阻止受CPU限制的任务。 但是我不明白的是,一个I / O任务仍然使用CPU。那么它怎么可能不会遇到相同的问题呢?是否因为I / O绑定任务不需要内存管理? 问题答案: 将在CPython的GIL 1中 只 涉及执行Py

  • 本文向大家介绍js绑定事件和解绑事件,包括了js绑定事件和解绑事件的使用技巧和注意事项,需要的朋友参考一下 在js中绑定多个事件用到的是两个方法:attachEvent和addEventListener,但是这两个方法又存在差异性 attachEvent方法  只支持IE678,不兼容其他浏览器 addEventListener方法   兼容火狐谷歌,不兼容IE8及以下 addEventListe

  • 我正在将一个kotlin库绑定到xamarin android,绑定并解决所有错误后,我得到了一个意外错误,没有任何解释或异常原因, JAVALang.NoClassDefFoundError:“未能解析:Landroidx/viewbinding/viewbinding;” 这是我得到的堆栈痕迹: MAYActivity.cs:40在Android。App.活动。n_OnCreate_Landr