Python 中的多线程还是串行处理?

Posted

技术标签:

【中文标题】Python 中的多线程还是串行处理?【英文标题】:Multithreading in Python or Serial Processing? 【发布时间】:2015-11-03 15:49:45 【问题描述】:

在“视觉效果的多线程”一书中,我读到了以下几行:

任何在 Python 中运行的东西都是唯一在 Python 中运行的东西,这意味着如果您的执行回调全部在 Python 中实现,您将失去多线程系统的大部分效率收益。

Python 解释器不是线程安全的——它不能同时在多个线程中运行。需要使用 Python 的线程必须等待轮到它使用解释器。

为什么这个说法是正确的?

这与想法有关,即代码是在 C++ 中执行的。

static void MyCallback(const Context &context)
Auto<Lock> lock(GetMyMutexFromContext(context));
...
EvalMyPythonString(str); //A function that takes the GIL
...    

那么究竟是什么意思呢?我们不能启动多个解释器吗?

【问题讨论】:

阅读一下:programmers.stackexchange.com/questions/186889/… 嗯,我理解正确吗,这仅适用于两个进程想要与一个 python 解释器交互的情况吗? 【参考方案1】:

任何在 Python 中运行的东西都是唯一在 Python 中运行的东西,这意味着如果您的执行回调全部在 Python 中实现,您将失去多线程系统的大部分效率收益。

Python 解释器不是线程安全的——它不能同时在多个线程中运行。需要使用 Python 的线程必须等待轮到它使用解释器。

这个说法是真的吗?这取决于您使用的 Python 解释器。

使用 Cpython: 由于 Global Interpreter Lock (GIL),只能同时运行一个线程。所以你不能利用使用多线程的性能优势。甚至,在 Cpython 中使用多个线程时,您的程序会变慢。

如果你想用 Cpython 编写并行程序,你应该使用multiprocessing。其接口与threading模块相同。

或者,您可以在 Jython、Ironthon 中使用多线程。

【讨论】:

以上是关于Python 中的多线程还是串行处理?的主要内容,如果未能解决你的问题,请参考以下文章

Python中的多线程并行运行

Python 线程与 Linux 中的多处理

Python中的多处理:处理多个工作线程

内存泄漏在哪里? python - 如何在python中的多处理期间使线程超时?

人生苦短之Python多线程

多处理和多线程