Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is runtime in context of Python? What does it consist of?

In context to this question What is “runtime”? (https://stackoverflow.com/questions/3900549/what-is-runtime/3900561)

I am trying to understand what would a python runtime be made of. My guess is:

  1. The python process that contains all runtime variables.
  2. The GIL
  3. The underlying interpreter code (CPython etc.).

Now if this is right, can we say that multiprocessing in python creates multiple runtimes and a python process is something we can directly relate to the runtime? (I think this is the right option)

Or, every python thread with its own stack which works on the same GIL and memory space as the parent process can be called as having a separate runtime?

Or, doesn't matter how many threads or processes are running, it will all come under a single runtime?

Simply put, what is the definition of runtime in the context of Python?

PS: I understand the difference between threads and processes. GIL: I understand the impacts but I do not grok it.

like image 263
sprksh Avatar asked Feb 18 '20 04:02

sprksh


People also ask

What is the runtime context?

The runtime context defines system-specific services to be provided by the runtime environment. The runtime context is an abstract class whose implementation may vary according to the Java VM environment.

What it means runtime?

It is the time that a program is running alongside all the external instructions needed for proper execution. Some of these external instructions are called runtime systems or runtime environments and come as integral parts of the programming language.

Does the Python runtime environment include a Python interpreter?

A Python environment is a context in which you run Python code and includes global, virtual, and conda environments. An environment consists of an interpreter, a library (typically the Python Standard Library), and a set of installed packages.

What is runtime environment in programming?

The runtime environment is the environment in which a program or application is executed. It's the hardware and software infrastructure that supports the running of a particular codebase in real time.


Video Answer


1 Answers

You are talking about two different (yet similar) concepts in computer science; multiprocess, and multithreading. Here is some compilation of questions/answers that might be useful:

  • Multiprocessing -- Wikipedia

Multiprocessing is the use of two or more central processing units (CPUs) within a single computer system.The term also refers to the ability of a system to support more than one processor or the ability to allocate tasks between them.

  • Multithreading -- Wikipedia

In computer architecture, multithreading is the ability of a central processing unit (CPU) (or a single core in a multi-core processor) to provide multiple threads of execution concurrently, supported by the operating system. This approach differs from multiprocessing. In a multithreaded application, the threads share the resources of a single or multiple cores, which include the computing units, the CPU caches, and the translation lookaside buffer (TLB).

  • What is the difference between a process and a thread? -- StackOverflow

Process

Each process provides the resources needed to execute a program. A process has a virtual address space, executable code, open handles to system objects, a security context, a unique process identifier, environment variables, a priority class, minimum and maximum working set sizes, and at least one thread of execution. Each process is started with a single thread, often called the primary thread, but can create additional threads from any of its threads.

Thread

A thread is an entity within a process that can be scheduled for execution. All threads of a process share its virtual address space and system resources. In addition, each thread maintains exception handlers, a scheduling priority, thread local storage, a unique thread identifier, and a set of structures the system will use to save the thread context until it is scheduled. The thread context includes the thread's set of machine registers, the kernel stack, a thread environment block, and a user stack in the address space of the thread's process. Threads can also have their own security context, which can be used for impersonating clients.


  • Meaning of “Runtime Environment” and of “Software framework”? -- StackOverflow

A runtime environment basically is a virtual machine that runs on top of a machine - provides machine abstraction. It is generally lower level than a library. A framework can contain a runtime environment, but is generally tied to a library.

  • Runtime System -- Wikipedia

In computer programming, a runtime system, also called runtime environment, primarily implements portions of an execution model. Most languages have some form of runtime system that provides an environment in which programs run. This environment may address a number of issues including the layout of application memory, how the program accesses variables, mechanisms for passing parameters between procedures, interfacing with the operating system, and otherwise. Typically the runtime system will have some responsibility for setting up and managing the stack and heap, and may include features such as garbage collection, threads or other dynamic features built into the language.

  • global interpreter lock -- Python Docs

The mechanism used by the CPython interpreter to assure that only one thread executes Python bytecode at a time. This simplifies the CPython implementation by making the object model (including critical built-in types such as dict) implicitly safe against concurrent access. Locking the entire interpreter makes it easier for the interpreter to be multi-threaded, at the expense of much of the parallelism afforded by multi-processor machines.

However, some extension modules, either standard or third-party, are designed so as to release the GIL when doing computationally-intensive tasks such as compression or hashing. Also, the GIL is always released when doing I/O.

Past efforts to create a “free-threaded” interpreter (one which locks shared data at a much finer granularity) have not been successful because performance suffered in the common single-processor case. It is believed that overcoming this performance issue would make the implementation much more complicated and therefore costlier to maintain.

Useful source for more info on GIL.

  • Does python os.fork uses the same python interpreter? -- StackOverflow

Whenever you fork, the entire Python process is duplicated in memory (including the Python interpreter, your code and any libraries, current stack etc.) to create a second process - one reason why forking a process is much more expensive than creating a thread.

This creates a new copy of the python interpreter.

One advantage of having two python interpreters running is that you now have two GIL's (Global Interpreter Locks), and therefore can have true multi-processing on a multi-core system.

Threads in one process share the same GIL, meaning only one runs at a given moment, giving only the illusion of parallelism.

  • Memory Management -- Python Docs

Memory management in Python involves a private heap containing all Python objects and data structures. The management of this private heap is ensured internally by the Python memory manager. The Python memory manager has different components which deal with various dynamic storage management aspects, like sharing, segmentation, preallocation or caching.


When you spawn a thread via the threading library, you are effectively spawning jobs inside a single Python runtime. This runtime ensures the threads have a shared memory and manages the running sequence of these threads via the global interpreter lock:

  • Understanding the Python GIL -- dabeaz

When you spawn a process via the multiprocessing library, you are spawning a new process that contains a new Python interpreter (a new runtime) that runs the designated code. If you want to share memory you have to use multiprocessing.shared_memory:

  • multiprocessing.shared_memory -- Python Docs

This module provides a class, SharedMemory, for the allocation and management of shared memory to be accessed by one or more processes on a multicore or symmetric multiprocessor (SMP) machine. To assist with the life-cycle management of shared memory especially across distinct processes, a BaseManager subclass, SharedMemoryManager, is also provided in the multiprocessing.managers module.


Can we say that multiprocessing in python creates multiple runtimes and a python process is something we can directly relate to the runtime?

Yes. Different GIL, different memory space, different runtime.

Every python thread with its own stack which works on the same GIL and memory space as the parent process can be called as having a separate runtime?

Depends what you mean by "stack". Same GIL, shared memory space, same runtime.

Doesn't matter how many threads and processes are running, it will all come under a single runtime?

Depends if multithreading/multiprocess.

Simply put, what is the definition of runtime in the context of Python?

The runtime environment is literally python.exe or /usr/bin/python. It's the Python executable that will interpret your Python code by transforming it into CPU-readable bytecode. When you multithread, you only have one python running. When you multiprocess you have multiple pythons running.


I hope that a core dev can come in and speak more to this in greater detail. For now the above is simply just a compilation of sources for you to start understanding/seeing the bigger picture.

like image 118
Felipe Avatar answered Nov 14 '22 23:11

Felipe