【发布时间】:2009-12-16 05:43:19
【问题描述】:
python GIL 的存在是否意味着在 python 多线程中 same 操作与在单个线程中重复操作没有太大区别?
例如,如果我需要上传两个文件,那么在两个线程中进行而不是一个接一个地上传它们有什么好处?
我尝试了两种方式的大型数学运算。但它们似乎需要几乎相同的时间才能完成。
这对我来说似乎不清楚。有人可以帮我吗? 谢谢。
【问题讨论】:
标签: python multithreading gil
python GIL 的存在是否意味着在 python 多线程中 same 操作与在单个线程中重复操作没有太大区别?
例如,如果我需要上传两个文件,那么在两个线程中进行而不是一个接一个地上传它们有什么好处?
我尝试了两种方式的大型数学运算。但它们似乎需要几乎相同的时间才能完成。
这对我来说似乎不清楚。有人可以帮我吗? 谢谢。
【问题讨论】:
标签: python multithreading gil
Python 的线程得到的评价比它们应得的要差一些。在三种情况下(嗯,2.5),它们实际上可以为您带来好处:
如果非 Python 代码(例如 C 库、内核等)正在运行,其他 Python 线程可以继续执行。它只是不能同时在两个线程中运行的纯 Python 代码。因此,如果您正在处理磁盘或网络 I/O,线程确实可以为您带来一些好处,因为大部分时间都花在 Python 本身之外。
GIL 实际上并不是 Python 的一部分,它是 CPython 的实现细节(核心 Python 开发人员所从事的“参考”实现,您通常如果你只是在你的 Linux 机器上运行“python”或其他东西,就会得到。
Jython、IronPython 和 Python 的任何其他重新实现通常没有具有 GIL,并且多个纯 Python 线程可以同时执行。
0.5 案例:即使您完全是纯 Python 并且看到线程的性能优势很少或根本没有,但就开发人员的时间和使用线程解决的难度而言,有些问题确实很方便。当然,这也部分取决于开发人员。
【讨论】:
这实际上取决于您使用的库。 GIL 旨在防止同时更改 Python 对象及其内部数据结构。如果您正在上传,则用于进行实际上传的库可能会在等待实际 HTTP 请求完成时释放 GIL(我假设标准库中的 HTTP 模块就是这种情况,但我没有检查)。
附带说明,如果您真的想让事情并行运行,只需使用多个进程。它会为您省去很多麻烦,并且您最终会得到更好的代码(更健壮、更具可扩展性并且很可能结构更好)。
【讨论】:
这取决于正在执行的本机代码模块。原生模块可以释放 GIL,然后执行自己的操作,允许另一个线程锁定 GIL。 GIL 通常是在 Python 和本机代码在 Python 对象上运行时保存的。如果您想了解更多详细信息,您可能需要阅读大量相关信息。 :)
见: What is a global interpreter lock (GIL)? 和 Thread State and the Global Interpreter Lock
【讨论】:
多线程是一个需要同时完成两个以上任务的概念,例如,我在这个应用程序中有文字处理器,有 N 个并行任务必须工作。就像听键盘,格式化输入文本,发送格式化文本到显示单元。在这种顺序处理的上下文中,它是耗时的,一个任务必须等到下一个任务完成。所以我们把这些任务放到线程中,同时完成任务。三个线程始终处于启动状态并等待输入到达,然后同时获取该输入并产生输出。
如果我们有多核和处理器,多线程的工作速度会更快。但实际上单处理器,线程会一个接一个地工作,但我们感觉它的执行速度更快,实际上一次执行一条指令,一个处理器一次可以执行数十亿条指令。所以计算机产生了多任务或线程并行工作的错觉。这只是一种错觉。
【讨论】: