Python上下文中的运行时是什么?它由什么组成?

Python上下文中的运行时是什么?它由什么组成?,python,multiprocessing,runtime,terminology,gil,Python,Multiprocessing,Runtime,Terminology,Gil,关于这个问题 我试图理解python运行时是由什么组成的。我的猜测是: 包含所有运行时变量的python进程 吉尔 底层解释器代码(CPython等) 如果这是正确的,那么我们可以说python中的多处理创建了多个运行时,并且python进程可以直接与运行时相关吗?(我认为这是正确的选择) 或者,每个python线程都有自己的堆栈,与父进程在相同的GIL和内存空间上工作,可以称为具有单独的运行时 或者,不管有多少线程或进程正在运行,它都将在一个运行时下运行 简单地说,在Python上下文中,运行

关于这个问题

我试图理解python运行时是由什么组成的。我的猜测是:

  • 包含所有运行时变量的python进程
  • 吉尔
  • 底层解释器代码(CPython等)
  • 如果这是正确的,那么我们可以说python中的多处理创建了多个运行时,并且python进程可以直接与运行时相关吗?(我认为这是正确的选择)

    或者,每个python线程都有自己的堆栈,与父进程在相同的GIL和内存空间上工作,可以称为具有单独的运行时

    或者,不管有多少线程或进程正在运行,它都将在一个运行时下运行

    简单地说,在Python上下文中,运行时的定义是什么


    PS:我理解线程和进程之间的区别。吉尔:我理解这些影响,但我并不怀疑。

    你说的是计算机科学中两个不同(但相似)的概念;多进程和多线程。以下是一些可能有用的问题/答案汇编:

    多处理是指在一个计算机系统中使用两个或多个中央处理器(CPU)。该术语还指一个系统支持多个处理器的能力或在它们之间分配任务的能力

    在计算机体系结构中,多线程是中央处理器(CPU)(或多核处理器中的单核)在操作系统的支持下并发提供多个执行线程的能力。这种方法不同于多处理。在多线程应用程序中,线程共享单个或多个内核的资源,这些内核包括计算单元、CPU缓存和转换查找缓冲区(TLB)

    过程 每个进程都提供执行程序所需的资源。进程具有虚拟地址空间、可执行代码、系统对象的开放句柄、安全上下文、唯一进程标识符、环境变量、优先级类、最小和最大工作集大小,以及至少一个执行线程。每个进程都由一个线程启动,通常称为主线程,但可以从其任何线程创建其他线程

    线 线程是进程中可以计划执行的实体。进程的所有线程共享其虚拟地址空间和系统资源。此外,每个线程都维护异常处理程序、调度优先级、线程本地存储、唯一的线程标识符和一组结构,系统将使用这些结构来保存线程上下文,直到它被调度为止。线程上下文包括线程的机器寄存器集、内核堆栈、线程环境块和线程进程地址空间中的用户堆栈。线程还可以有自己的安全上下文,可用于模拟客户端


    运行时环境基本上是一个在机器上运行的虚拟机——提供机器抽象。它通常比图书馆的级别低。框架可以包含运行时环境,但通常绑定到库

    在计算机编程中,运行时系统(也称为运行时环境)主要实现执行模型的一部分。大多数语言都有某种形式的运行时系统,提供程序运行的环境。该环境可以解决许多问题,包括应用程序内存的布局、程序如何访问变量、在过程之间传递参数的机制、与操作系统的接口等。通常,运行时系统将负责设置和管理堆栈和堆,并可能包括垃圾收集、线程或语言中内置的其他动态功能

    CPython解释器使用的机制,用于确保一次只有一个线程执行Python字节码。这简化了CPython实现,使对象模型(包括关键的内置类型,如dict)对并发访问隐式安全。锁定整个解释器使解释器更容易成为多线程的解释器,而牺牲了多处理器机器提供的大部分并行性

    然而,一些扩展模块,无论是标准的还是第三方的,被设计成在执行诸如压缩或散列之类的计算密集型任务时释放GIL。此外,在执行I/O时,GIL总是被释放

    过去创建“自由线程”解释器(以更精细的粒度锁定共享数据的解释器)的努力没有成功,因为在常见的单处理器情况下性能会受到影响。人们认为,克服这一性能问题将使实现更加复杂,因此维护成本更高

    有关GIL的更多信息的有用来源

    无论何时分叉,都会在内存中复制整个Python进程(包括Python解释器、代码和任何库、当前堆栈等),以创建第二个进程——分叉进程比创建线程成本高得多的一个原因

    这将创建python解释器的新副本

    运行两个python解释器的一个优点是,您现在有两个GIL(全局解释器锁),因此可以在多核系统上进行真正的多处理

    一个进程中的线程共享相同的GIL,这意味着在给定的时刻只有一个线程运行,只会产生并行的错觉

    Python中的内存管理涉及包含所有Python对象和数据的私有堆