关于python-GIL的一个问题
pythongil的存在是否意味着在python多线程中,相同的操作与在单个线程中重复它没有太大区别 例如,如果我需要上传两个文件,在两个线程中完成它们而不是一个接一个地上传它们有什么好处 我尝试了两种方式的大型数学运算。但它们似乎花费了几乎相同的时间来完成 这对我来说似乎不清楚。有人能帮我吗?。关于python-GIL的一个问题,python,multithreading,gil,Python,Multithreading,Gil,pythongil的存在是否意味着在python多线程中,相同的操作与在单个线程中重复它没有太大区别 例如,如果我需要上传两个文件,在两个线程中完成它们而不是一个接一个地上传它们有什么好处 我尝试了两种方式的大型数学运算。但它们似乎花费了几乎相同的时间来完成 这对我来说似乎不清楚。有人能帮我吗?。 谢谢。这取决于正在执行的本机代码模块。本机模块可以释放GIL,然后启动并执行自己的操作,允许另一个线程锁定GIL。GIL通常在python和本机代码在python对象上运行时保存。如果你想了解更多的细
谢谢。这取决于正在执行的本机代码模块。本机模块可以释放GIL,然后启动并执行自己的操作,允许另一个线程锁定GIL。GIL通常在python和本机代码在python对象上运行时保存。如果你想了解更多的细节,你可能需要去读一读 见:
而且,这实际上取决于您使用的库。GIL旨在防止同时更改Python对象及其内部数据结构。如果您正在进行上载,那么用于实际上载的库可能会在等待实际HTTP请求完成时释放GIL(我假设标准库中的HTTP模块就是这种情况,但我没有检查)
作为补充说明,如果您真的想让事情并行运行,只需使用多个进程即可。它将为您节省很多麻烦,最终您将得到更好的代码(更健壮、更可扩展,而且很可能结构更好)。Python的线程受到的攻击比它们应得的稍差一些。有三种(好吧,2.5种)情况下,他们实际上会给你带来好处:
- 如果非Python代码(例如C库、内核等)正在运行,其他Python线程可以继续执行。这是唯一不能同时在两个线程中运行的纯Python代码。因此,如果您正在进行磁盘或网络I/O,线程确实可以为您购买一些东西,因为大部分时间都花在Python本身之外
- GIL实际上不是Python的一部分,它是CPython(核心Python开发人员使用的“参考”实现)的一个实现细节,如果您只是在Linux机器上运行“Python”或其他东西,通常会得到它 Jython、IronPython和任何其他Python的重新实现通常没有GIL,多个纯Python线程可以同时执行
- 0.5案例:即使您完全是纯Python,并且很少或根本看不到线程带来的性能好处,但从开发人员的时间和线程解决的难度来看,有些问题确实很方便。当然,这在一定程度上也取决于开发人员
因此,如果我们有多核和处理器,多线程的工作速度会更快。但实际上,在单处理器中,线程会一个接一个地工作,但我们感觉它的执行速度更快,实际上,一次执行一条指令,一个处理器可以一次执行数十亿条指令。因此,计算机产生了一种错觉,认为多线程i-task或线程并行工作。这只是一种幻觉。当然,GIL只是CPython中的一个问题。虽然我真的无法想象有人会因为它而迁移到Jython或IronPython,但有更好的方法来解决它。还有Unladen Swallow,这是谷歌为CPython构建快速替代品的项目。我也应该这样做吗注意,多处理是跨多台机器扩展的网关。线程无法实现这一点。