【问题标题】:A question on python GIL关于python GIL的一个问题
【发布时间】:2009-12-16 05:43:19
【问题描述】:

python GIL 的存在是否意味着在 python 多线程中 same 操作与在单个线程中重复操作没有太大区别?

例如,如果我需要上传两个文件,那么在两个线程中进行而不是一个接一个地上传它们有什么好处?

我尝试了两种方式的大型数学运算。但它们似乎需要几乎相同的时间才能完成。

这对我来说似乎不清楚。有人可以帮我吗? 谢谢。

【问题讨论】:

    标签: python multithreading gil


    【解决方案1】:

    Python 的线程得到的评价比它们应得的要差一些。在三种情况下(嗯,2.5),它们实际上可以为您带来好处:

    • 如果非 Python 代码(例如 C 库、内核等)正在运行,其他 Python 线程可以继续执行。它只是不能同时在两个线程中运行的纯 Python 代码。因此,如果您正在处理磁盘或网络 I/O,线程确实可以为您带来一些好处,因为大部分时间都花在 Python 本身之外。

    • GIL 实际上并不是 Python 的一部分,它是 CPython 的实现细节(核心 Python 开发人员所从事的“参考”实现,您通常如果你只是在你的 Linux 机器上运行“python”或其他东西,就会得到。

      Jython、IronPython 和 Python 的任何其他重新实现通常没有具有 GIL,并且多个纯 Python 线程可以同时执行。

    • 0.5 案例:即使您完全是纯 Python 并且看到线程的性能优势很少或根本没有,但就开发人员的时间和使用线程解决的难度而言,有些问题确实很方便。当然,这也部分取决于开发人员。

    【讨论】:

    • 当然,GIL 只是 CPython 中的一个问题。虽然我真的无法想象有人会因为有更好的方法绕过它而转向 Jython 或 IronPython。
    • 还有 Unladen Swallow,这是 Google 为 CPython 构建快速替代品的项目。
    【解决方案2】:

    这实际上取决于您使用的库。 GIL 旨在防止同时更改 Python 对象及其内部数据结构。如果您正在上传,则用于进行实际上传的库可能会在等待实际 HTTP 请求完成时释放 GIL(我假设标准库中的 HTTP 模块就是这种情况,但我没有检查)。

    附带说明,如果您真的想让事情并行运行,只需使用多个进程。它会为您省去很多麻烦,并且您最终会得到更好的代码(更健壮、更具可扩展性并且很可能结构更好)。

    【讨论】:

    • 还应该提到多处理是跨多台机器扩展的网关。线程无法让您到达那里。
    【解决方案3】:

    这取决于正在执行的本机代码模块。原生模块可以释放 GIL,然后执行自己的操作,允许另一个线程锁定 GIL。 GIL 通常是在 Python 和本机代码在 Python 对象上运行时保存的。如果您想了解更多详细信息,您可能需要阅读大量相关信息。 :)

    见: What is a global interpreter lock (GIL)?Thread State and the Global Interpreter Lock

    【讨论】:

      【解决方案4】:

      多线程是一个需要同时完成两个以上任务的概念,例如,我在这个应用程序中有文字处理器,有 N 个并行任务必须工作。就像听键盘,格式化输入文本,发送格式化文本到显示单元。在这种顺序处理的上下文中,它是耗时的,一个任务必须等到下一个任务完成。所以我们把这些任务放到线程中,同时完成任务。三个线程始终处于启动状态并等待输入到达,然后同时获取该输入并产生输出。

      如果我们有多核和处理器,多线程的工作速度会更快。但实际上单处理器,线程会一个接一个地工作,但我们感觉它的执行速度更快,实际上一次执行一条指令,一个处理器一次可以执行数十亿条指令。所以计算机产生了多任务或线程并行工作的错觉。这只是一种错觉。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-09
        • 2021-03-11
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        相关资源
        最近更新 更多