spr*_*ksh 5 python terminology runtime multiprocessing gil
在这个问题的上下文中什么是“运行时”?(/sf/ask/273038461/)
我试图了解 python 运行时由什么组成。我的猜测是:
现在,如果这是正确的,我们是否可以说 python 中的多处理创建了多个运行时并且一个 python 进程是我们可以直接与运行时相关联的东西?(我认为这是正确的选择)
或者,每个 python 线程都有自己的堆栈,与父进程在相同的 GIL 和内存空间上工作,可以被称为具有单独的运行时?
或者,不管有多少线程或进程正在运行,它都会在一个运行时下运行?
简单来说,Python 上下文中运行时的定义是什么?
PS:我理解线程和进程之间的区别。GIL:我理解这些影响,但我不理解。
Fel*_*ria 11
你在谈论计算机科学中两个不同(但相似)的概念;多进程和多线程。以下是一些可能有用的问题/答案汇编:
多处理是在单个计算机系统中使用两个或多个中央处理器 (CPU)。该术语还指系统支持多个处理器的能力或在它们之间分配任务的能力。
在计算机体系结构中,多线程是中央处理单元 (CPU)(或多核处理器中的单核)在操作系统支持下同时提供多个执行线程的能力。这种方法不同于多处理。在多线程应用程序中,线程共享单个或多个内核的资源,包括计算单元、CPU 缓存和转换后备缓冲区 (TLB)。
过程
每个进程提供执行程序所需的资源。进程具有虚拟地址空间、可执行代码、系统对象的开放句柄、安全上下文、唯一进程标识符、环境变量、优先级类、最小和最大工作集大小以及至少一个执行线程。每个进程都以单个线程启动,通常称为主线程,但可以从其任何线程创建其他线程。
线
线程是进程中可以调度执行的实体。进程的所有线程共享其虚拟地址空间和系统资源。此外,每个线程都维护异常处理程序、调度优先级、线程本地存储、唯一的线程标识符以及系统将用来保存线程上下文直到被调度的一组结构。线程上下文包括线程的机器寄存器集、内核堆栈、线程环境块和线程进程地址空间中的用户堆栈。线程也可以有自己的安全上下文,可用于模拟客户端。
运行时环境基本上是一个运行在机器之上的虚拟机——提供机器抽象。它通常比图书馆低。框架可以包含运行时环境,但通常与库相关联。
在计算机编程中,运行时系统,也称为运行时环境,主要实现部分执行模型。大多数语言都有某种形式的运行时系统,提供程序运行的环境。这种环境可以解决许多问题,包括应用程序内存的布局、程序如何访问变量、在过程之间传递参数的机制、与操作系统的接口等。通常,运行时系统将负责设置和管理堆栈和堆,并且可能包括诸如垃圾收集、线程或其他内置于语言中的动态功能等功能。
CPython 解释器用来确保一次只有一个线程执行 Python 字节码的机制。这通过使对象模型(包括关键的内置类型,如 dict)隐式安全地防止并发访问来简化 CPython 实现。锁定整个解释器使解释器更容易成为多线程,但代价是多处理器机器提供的大部分并行性。
但是,一些扩展模块,无论是标准的还是第三方的,都被设计为在执行压缩或散列等计算密集型任务时释放 GIL。此外,在执行 I/O 时始终会释放 GIL。
过去创建“自由线程”解释器(以更精细的粒度锁定共享数据的解释器)的努力没有成功,因为在常见的单处理器情况下性能会受到影响。相信克服这个性能问题会使实现更加复杂,因此维护成本更高。
有关 GIL 的更多信息的有用来源。
每当您 fork 时,整个 Python 进程都会在内存中复制(包括 Python 解释器、您的代码和任何库、当前堆栈等)以创建第二个进程 - 一个原因 fork 一个进程比创建一个线程要昂贵得多。
这将创建 python 解释器的新副本。
运行两个 Python 解释器的优势之一是您现在有两个 GIL(全局解释器锁),因此可以在多核系统上进行真正的多处理。
一个进程中的线程共享相同的 GIL,这意味着在给定时刻只有一个线程运行,只会产生并行的错觉。
Python 中的内存管理涉及一个包含所有 Python 对象和数据结构的私有堆。这个私有堆的管理是由 Python 内存管理器在内部确保的。Python 内存管理器具有处理各种动态存储管理方面的不同组件,例如共享、分段、预分配或缓存。
当您通过threading库生成线程时,您实际上是在单个 Python 运行时内生成作业。此运行时确保线程具有共享内存并通过以下方式管理这些线程的运行顺序global interpreter lock:
当您通过multiprocessing库生成一个进程时,您将生成一个包含运行指定代码的新 Python 解释器(新运行时)的新进程。如果要共享内存,则必须使用multiprocessing.shared_memory:
该模块提供了一个类,
SharedMemory用于分配和管理共享内存,供多核或对称多处理器 (SMP) 机器上的一个或多个进程访问。为了协助共享内存的生命周期管理,尤其是跨不同进程的共享内存SharedMemoryManager,在 multiprocessing.managers 模块中还提供了一个 BaseManager 子类。
是的。不同的 GIL,不同的内存空间,不同的运行时。
取决于您所说的“堆栈”是什么意思。相同的 GIL,共享内存空间,相同的运行时间。
取决于是否多线程/多进程。
运行时环境是字面上的python.exe或/usr/bin/python. 它是 Python 可执行文件,它将通过将 Python 代码转换为 CPU 可读的字节码来解释它。当您使用多线程时,您只会python运行一个。当您运行multiprocess多个pythons 时。
我希望核心开发人员可以进来并更详细地对此进行更多讨论。目前,以上只是一个来源的汇编,供您开始理解/看到更大的图景。