Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于python-GIL的一个问题_Python_Multithreading_Gil - Fatal编程技术网

关于python-GIL的一个问题

关于python-GIL的一个问题,python,multithreading,gil,Python,Multithreading,Gil,pythongil的存在是否意味着在python多线程中,相同的操作与在单个线程中重复它没有太大区别 例如,如果我需要上传两个文件,在两个线程中完成它们而不是一个接一个地上传它们有什么好处 我尝试了两种方式的大型数学运算。但它们似乎花费了几乎相同的时间来完成 这对我来说似乎不清楚。有人能帮我吗?。 谢谢。这取决于正在执行的本机代码模块。本机模块可以释放GIL,然后启动并执行自己的操作,允许另一个线程锁定GIL。GIL通常在python和本机代码在python对象上运行时保存。如果你想了解更多的细

pythongil的存在是否意味着在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,并且很少或根本看不到线程带来的性能好处,但从开发人员的时间和线程解决的难度来看,有些问题确实很方便。当然,这在一定程度上也取决于开发人员


多线程是一个需要同时完成两个或多个任务的概念,例如,我在这个应用程序中使用了文字处理器,一个并行任务有N个数字必须工作。就像听键盘,格式化输入文本,将格式化文本发送到显示单元。在这个具有顺序处理的上下文中,它是tim一个任务需要等待下一个任务完成。因此,我们将这些任务放在线程中,同时完成任务。三个线程始终处于启动状态,等待输入到达,然后接受该输入并同时生成输出


因此,如果我们有多核和处理器,多线程的工作速度会更快。但实际上,在单处理器中,线程会一个接一个地工作,但我们感觉它的执行速度更快,实际上,一次执行一条指令,一个处理器可以一次执行数十亿条指令。因此,计算机产生了一种错觉,认为多线程i-task或线程并行工作。这只是一种幻觉。

当然,GIL只是CPython中的一个问题。虽然我真的无法想象有人会因为它而迁移到Jython或IronPython,但有更好的方法来解决它。还有Unladen Swallow,这是谷歌为CPython构建快速替代品的项目。我也应该这样做吗注意,多处理是跨多台机器扩展的网关。线程无法实现这一点。