问题标签 [gil]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
7296 浏览

python - 在多线程 C 应用程序中嵌入 python

我将 python 解释器嵌入到多线程 C 应用程序中,我对应该使用哪些 API 来确保线程安全感到有些困惑。

根据我收集到的信息,在嵌入 python 时,在调用任何其他 Python C API 调用之前,由嵌入器负责处理 GIL 锁。这是通过以下功能完成的:

但这似乎还不够。我仍然遇到随机崩溃,因为它似乎没有为 Python API 提供互斥。

在阅读了更多文档后,我还添加了:

就在调用之后,Py_IsInitialized()但这就是令人困惑的部分。文档指出此功能:

初始化并获取全局解释器锁

这表明当这个函数返回时,GIL 应该被锁定并且应该以某种方式解锁。但实际上这似乎不是必需的。有了这条线,我的多线程工作完美,并且功能保持互斥PyGILState_Ensure/Release
当我在应用程序在随后的调用中很快死锁PyEval_ReleaseLock()后尝试添加.PyEval_ReleaseLock()PyImport_ExecCodeModule()

那么我在这里错过了什么?

0 投票
3 回答
2408 浏览

python - Python GIL:django save() 是否阻塞?

我的 django 应用程序将 django 模型保存到远程数据库。有时扑救是突发的。为了将应用程序的主线程 (*thread_A*) 从将多个对象保存到数据库的时间成本中解放出来,我想将模型对象转移到一个单独的线程 (*thread_B*)collections.deque并使用 *thread_B* 保存他们依次。

但是我不确定这个计划。save()返回新数据库条目的 id,因此它仅在数据库响应后“结束”,即事务结束。

django.db.models.Model.save()真的会阻塞GIL并在事务期间释放其他 python 线程吗?

0 投票
2 回答
1024 浏览

database - 用于保存 Django 模型的单独线程

我正在构建一个使用远程数据库的应用程序 - 它将 A 类型的对象保存到数据库并数据库中读取 B 类型的对象。

由于保存模型有可能阻塞和释放 GIL,并且应用程序本身不使用保存的对象,我想将调用移至.save()单独的线程。

我知道 Django 通常不是线程安全的。所以我的问题是 - 在另一个线程保存 A 类型的对象时查询 B 类型的对象是否有任何问题?

0 投票
2 回答
224 浏览

python - 使用 GIL 作为线程池

注意:我缺乏对这个主题的教育,所以我可能会做出一些幼稚的假设。

假设您有一个执行阻塞 I/O 的函数。您需要运行此功能 n 次。

如果您要简单地生成 n 个线程(使用 threading 模块)并同时启动它们,那么简单地使用 GIL 来管理线程(基于 I/O)而不是使用 multiprocessing.pool 模块是否可行管理子流程?

0 投票
1 回答
142 浏览

python - 如何根据参数提供的时间在 Python 中执行函数

如何根据 seconds 参数提供的时间在 Python 中执行函数。

正如我正在考虑的那样, time.clock() 在这里真的帮不上忙,因为一个函数可能真的很难,它永远不会到达一个计数器来显示一些结果或中止。

我必须使用线程模块吗?我对线程知之甚少,但从我读到的内容来看——根据 GIL,你只能有一个线程在工作,而这个过程实际上同时需要 2 个线程.. 或者其他一些我不知道的技巧.

0 投票
1 回答
1865 浏览

python - Python GIL 和多线程

我想将我的单线程应用程序与工作线程数分开。只有 1 个问题 - 这个动作的表现如何?如果 GIL 阻止 python 同时执行超过 1 个线程,我会有任何利润吗?

另一点(从 c/c++ 的角度来看) - 据我所知,每个线程无论如何只能以独占方式执行,所以在低于 python 解释器的级别中,我有同样的限制。

摘要:python线程在部分任务切换中的效率会低于“本机”线程吗?

0 投票
2 回答
5431 浏览

python - 如何检查线程当前是否持有 GIL?

我试图找到一个函数来告诉我当前线程是否具有全局解释器锁。

Python/C-API 文档似乎不包含这样的功能。

我当前的解决方案是PyGILState_Ensure()在释放它之前使用获取锁PyEval_SaveThread,而不是尝试释放当前线程未获取的锁。

(顺便说一句。“发出致命错误”是什么意思?)

这个问题的背景:我有一个嵌入 Python 的多线程应用程序。如果一个线程在没有释放锁的情况下关闭(这可能由于崩溃而发生),其他线程将无法再运行。因此,在清理/关闭线程时,我想检查该线程是否持有锁并在这种情况下释放它。

提前感谢您的回答!

0 投票
1 回答
1690 浏览

python - 如何在 Cython 中调用多线程 C 函数?

我有一个关于如何在 Cython 中调用多线程 C 函数的问题。

在 C 函数中执行多线程操作之前/之后是否需要释放/获取 GIL?

或者我可以像普通的 C 函数一样使用它吗?

我应该按照此处的说明进行一般 Python 扩展吗?

0 投票
2 回答
5980 浏览

python - Python 的锁定成本与性能,(多线程有意义吗?)

我正在做一个项目,我的代码吞吐量非常重要,经过一番考虑,我选择让我的程序线程化。

主线程和子线程都从两个共享字典中添加和删除。考虑到python中锁定的性能,我一直在浏览互联网上的一些输入,它是一个缓慢的操作等等。

所以我得到了什么,因为python实际上根本没有线程化(考虑到GIL只在一个核心上工作)如果我需要在我的应用程序中获得高性能,除了处理IO之外,我有什么可以通过使其线程化来赢得的?

编辑

实际问题是(在有见地的评论之后)

既然有 GIL,多线程在 python 中有意义吗?

0 投票
2 回答
1541 浏览

python - 在后台线程 python/pygtk 中运行计算

有没有办法在耗时的指令期间在后台运行 python 线程而不锁定 python 的其余部分?

我正在尝试在 python (pygtk) 应用程序的后台线程中进行耗时的计算。我了解线程是如何工作的。问题是每次我在任何线程中运行昂贵的操作(例如:PIL 的 image.load() 用于大图像)时,它都会阻塞所有 python 线程,直到操作完成,即使它位于单独的线程中。

那么,有没有办法在后台运行 python 线程而不锁定 python 的其余部分?(只要他们不锁定我的 GUI,我不在乎他们需要多长时间。我只是不能让我的 GUI 一次无响应几秒钟)。使用睡眠语句不起作用,因为我的问题是需要很长时间的单个命令(如 image.load())。