我想知道 python 线程是并发运行还是并行运行?
例如,如果我有两个任务并在两个线程中运行它们,它们是同时运行还是计划并发运行?
我知道 GIL 并且线程仅使用一个 CPU 内核。
请您参考如下方法:
这是一个需要大量解释的复杂问题。我将坚持使用 CPython,因为它是最广泛使用的并且我有经验。
由于这些事实,因此,它取决于。
话虽如此,线程在完成之前不需要保留 GIL,而是在需要时获取和释放锁。两个线程可能会交错其操作,因为 GIL 可以在代码块的末尾释放,被另一个线程抓取,在该代码块的末尾释放,等等。它们不会并行运行——但它们当然可以同时运行。
结果
因此,两个线程中的两个任务可以在 并行 中运行,前提是它们不需要访问 CPython 解释器。如果它们正在等待 I/O 请求或使用不需要 Python 解释器的合适的其他语言(例如 C)扩展,则可能会发生这种情况,使用外部函数接口(interface)。
在交错原子操作的意义上,所有线程都可以并发运行。这些交错究竟有多原子 - 在代码块之后释放 GIL 吗?每行之后? - 取决于任务和线程。 Python 线程不必串行执行——一个线程完成,然后另一个线程开始——所以在这个意义上存在并发。
