python GIL 的存在是否意味着在 python 多线程中相同的操作与在单个线程中重复它没有太大区别?
例如,如果我需要上传两个文件,那么在两个线程中进行而不是一个接一个地上传它们有什么好处?
我尝试了两种方式的大型数学运算。但它们似乎需要几乎相同的时间才能完成。
这对我来说似乎不清楚。有人可以帮我吗?谢谢。
python GIL 的存在是否意味着在 python 多线程中相同的操作与在单个线程中重复它没有太大区别?
例如,如果我需要上传两个文件,那么在两个线程中进行而不是一个接一个地上传它们有什么好处?
我尝试了两种方式的大型数学运算。但它们似乎需要几乎相同的时间才能完成。
这对我来说似乎不清楚。有人可以帮我吗?谢谢。
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 对象上运行时保存的。如果您想了解更多详细信息,您可能需要阅读大量相关信息。:)
多线程是一个需要同时完成两个以上任务的概念,例如,我在这个应用程序中有文字处理器,有 N 个并行任务必须工作。就像听键盘,格式化输入文本,发送格式化文本到显示单元。在这种顺序处理的上下文中,它是耗时的,一个任务必须等到下一个任务完成。所以我们把这些任务放到线程中,同时完成任务。三个线程始终处于启动状态并等待输入到达,然后获取该输入并同时产生输出。
因此,如果我们有多核和处理器,多线程的工作速度会更快。但实际上单处理器,线程会一个接一个地工作,但我们感觉它的执行速度更快,实际上,一次执行一条指令,一个处理器一次可以执行数十亿条指令。所以计算机产生了多任务或线程并行工作的错觉。这只是一种错觉。