【问题标题】:threading package in CPythonPython中的线程包
【发布时间】:2017-03-23 20:49:06
【问题描述】:

CPython 有一个全局解释器锁 (GIL)。

因此,多个线程不能同时运行 Python 字节码。

那么threading 包在 CPython 中的用途和相关性是什么?

【问题讨论】:

    标签: python gil


    【解决方案1】:

    在 I/O 期间,GIL 被释放到其他线程可以运行。 还有一些扩展(如numpy)可以在计算时释放GIL。

    因此,一个重要的目的是提高不受 CPU 限制的程序的性能。来自threading 模块的 Python 文档:

    CPython 实现细节:在 CPython 中,由于全局解释器锁,只有一个线程可以一次执行 Python 代码(即使某些面向性能的库可能会克服这个限制)。如果您希望您的应用程序更好地利用多核机器的计算资源,建议您使用multiprocessing 或concurrent.futures.ProcessPoolExecutor。但是,如果您想同时运行多个 I/O 密集型任务,threading 仍然是一个合适的模型。

    线程的另一个好处是在 GUI 程序中进行长时间运行的计算,而不必将计算分成足够小的部分以使其适合超时函数。

    另外请记住,虽然 CPython现在有 GIL,但未来可能并非总是如此。

    【讨论】:

      【解决方案2】:

      当 python 运行一些代码时,代码被编译成“原子”命令(= 小指令)。每隔几百个原子指令,python 就会切换到下一个线程并执行该线程的指令。这允许运行代码伪并行。 假设您有以下代码:

      def f1():
          while True:
              # wait for incomming connections and serve a website to them
      def f2():
          while True:
              # get new tweets and process them
      

      而你想同时执行f1() 和f2()。在这种情况下,您可以简单地使用threading,而不必担心不时打破循环来执行其他功能。这也比异步编程容易得多。

      简单说:它使编写需要做多件事的脚本更容易。

      另外,就像@roland-smith 所说,Python 在 I/O 和其他一些低级 c 代码期间释放 GIL。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多