问题标签 [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 投票
1 回答
159 浏览

python-2.7 - 使用多线程 pycassa xget() 调用实现对 cassandra 宽列族的基于范围的查询时,性能会变差吗?

我有一个典型的宽列族,其中包含 {rowkey--> uuid4+date 和时间序列数据作为列},我在其上使用 pycassa xget() 调用实现了基于范围的查询。并不是说我受到单线程代码性能不佳的困扰,我更想了解当 xget() 调用是并行而不是顺序(从 for: 循环内部)进行时性能的差异。

我使用“线程”python 库来实现基于范围的查询的多线程版本,性能实际上大大降低。现在我知道 python GIL 对多线程代码的影响,但是有什么方法可以确定这实际上是由 GIL 引起的吗?可能是其他原因造成的吗?

提前致谢。

注意:我没有考虑“多处理”库,因为我无法为每个子进程使用不同的 ConnectionPool 对象。

0 投票
0 回答
76 浏览

gil - 全局解释器锁(GIL)实现示例?

我们正在将一些遗留的 C 代码移植到 linux(NPTL)。旧代码在很大程度上依赖于非抢占式线程模型。我们正在研究的一种解决方案是通过实现某种全局锁来模仿 linux 中的这种模型。我猜它可能就像 CPython 或 Ruby 中的 GIL。

有没有 GIL 的参考实现?

谢谢

0 投票
2 回答
107 浏览

python - 为什么 Python 的 GIL 强制执行严格的处理顺序?

使用 python3 运行:

总是一样。

现在,我希望您能正确地回答我 - 我不一定希望对这些任务进行重新排序,但我只是想知道为什么会发生排序?我的意思是,人们可以期望在一个线程内以确定的方式完成任务,但是线程的严格排队对我来说似乎有点奇怪。

无论如何,如何在 Python 3 中获得真正的并发性?(据我所知,Jython 和 IronPython 仅支持 2.x)。

0 投票
1 回答
746 浏览

python - Pypy 的无堆栈线程选项是否支持并行执行?

我正在阅读有关 PyPy 的无堆栈功能。我的问题很简单:这能绕过 GIL 吗?该页面说它允许以“大规模并发样式”进行编码。这是否也意味着大规模并行风格,利用多核?

0 投票
1 回答
517 浏览

python - OpenMP、Python、C 扩展、内存访问和邪恶的 GIL

所以我目前正在尝试为一些 2d ndarray 做类似 A**b 的事情,并为 Python 并行做一个 double b 。我想通过使用 OpenMP 的 C 扩展来做到这一点(是的,我知道,有 Cython 等,但在某些时候,我总是遇到那些“高级”方法的麻烦......)。

所以这里是我的 gaussian.so 的 gaussian.c 代码:

(A 是一个方形双矩阵,out 具有相同的形状,n 是行/列数)所以重点是更新一些对称距离矩阵 - ind2 是 ind1 的转置索引。

我使用gcc -shared -fopenmp -o gaussian.so -lm gaussian.c. 我通过 Python 中的 ctypes 直接访问该函数:

只要我注释#pragma 行,“测试”功能就可以顺利运行 - 否则它会以错误号 139 结束。

当我将内部循环更改为仅打印 ind1 和 ind2 时,它并行运行平稳。当我只访问 ind1 位置并将 ind2 单独放置(甚至并行)时,它也可以工作!我在哪里搞砸了内存访问?我怎样才能解决这个问题?

谢谢你!

更新:嗯,我想这会遇到 GIL,但我还不确定......

更新:好的,我现在很确定,这是邪恶的 GIL 在这里杀死我,所以我更改了示例:

我现在有 gil.c:

gcc -shared -fopenmp -o gil.so -lm gil.c -I /usr/include/python2.7 -L /usr/lib/python2.7/ -lpython2.7这是使用和相应的 Python 文件编译的:

这给了我

现在不知何故,它似​​乎无法保存当前线程 - 但 API 文档在这里没有详细介绍,我希望在编写 C 函数时可以忽略 Python,但这似乎很混乱 :( 任何想法? 我觉得这很有帮助:GIL

0 投票
1 回答
341 浏览

python - Python 3.3 - subprocess.call 和 GIL

简单的问题:

我使用 subprocces.call 创建的 python 实例是否会受到与父进程相同的 GIL 的约束?

0 投票
2 回答
347 浏览

python - 编译多线程 Python 受 GIL 影响

由于 GIL 是围绕解释器的锁,它会影响编译后的 Python 吗?我想知道是否可以通过在执行之前简单地编译我的 python 来克服 cpython 固有的多线程限制。

希望这是有道理的,我不会遗漏一些明显的东西或误解 GIL 如何工作/影响执行。

谢谢

0 投票
1 回答
1093 浏览

python - 使用基于回调的 C 库时无法使用 Cython 发布 GIL

我正在创建一个 GTK/GStreamer 应用程序(用于音频的 C gstreamer 和用于 gui 的 pygobject gtk),它等待 MIDI 输入并对其做出响应。MIDI 捕获由 RTMidi 库处理。

过去,我能够在 Cython .pyx 文件中使用nogilgil关键字成功发布 GIL。问题是我需要能够从 python 的 C 回调函数中读取 MIDI 输入值,以便我可以根据这个输入对 GUI 进行更改。

因此,我稍微重组了我的代码,以便我的 python 代码传递一个 python 函数对象(我想在我的 RTMidi C 回调中调用的函数),然后我使用 Cython 将其转换为 void* 类型的对象,所以我可以通过 C 代码传递这些数据。

换句话说,每当检测到 MIDI 输入时,我作为 void* 传递的 python 函数就会被调用。这工作正常。自从我添加此功能以来,无法正常工作的部分是 GIL 的发布。现在,每当我的应用程序启动时,我接受 MIDI 输入的函数都没有在它自己的线程上正确启动,因此 GTK gui 从未真正显示。

有关在 Cython 文档中发布 GIL 的一些信息:

语句主体中的代码不得以任何方式操作 Python 对象,并且不得在未首先重新获取 GIL 的情况下调用任何操作 Python 对象的内容。Cython 目前不检查这一点。

我不相信我违反了这些规则中的任何一条。

这可能是 Cython 的错误还是我在这里遗漏了什么?

有没有其他人有使用 Cython 从 C 回调调用 python 函数的经验?

这是 .pyx 的简化版本。注意用于释放和获取 GIL 的“with gil”和“nogil”关键字:

这是pygobject gtk:

0 投票
2 回答
1096 浏览

python - Python & C/C++ 多线程:在 C 的后台运行多个执行 python 的线程

我有一个非常具体的需求:我想创建一个带有 Qt Widget 的 python 控制台,并且能够拥有多个独立的解释器。现在让我尝试解释我的问题在哪里以及我所做的所有尝试,按照我最想对那些我可以默认使用的人进行排序

  • 第一点是 Python C API (PyRun[...], PyEval[...] ...) 中的所有函数都需要 GIL 锁定,这禁止 C 的任何并发代码解释(否则我真的会很高兴错了!!!:D)

  • 因此,我尝试了另一种方法,而不是“通常的方法”:我在 python 中创建了一个循环,在我的特殊文件上调用 read() 并评估结果。此函数(作为内置扩展实现)阻塞,直到有数据要读取。(实际上,它目前是 C 代码中的一段时间,而不是基于 pthread 的条件)然后,使用 PyRun_simpleString(),我在另一个线程中启动我的循环。这就是问题所在:我的读取函数,除了阻塞当前线程(这是完全正常的)之外,它阻塞了整个解释器,并且 PyRun_simpleString() 不返回......

  • 最后,我有最后一个想法可能会相对较慢:在 C++ 中有一个专用线程来运行解释器,并在 python 中做所有事情来管理输入/输出。这可能是一个循环,当存在需要执行命令的控制台时创建作业。似乎不是很难做到,但我更喜欢问你:有没有办法使上述可能性发挥作用,或者有没有另一种我没有想到的方法,或者我的最后一个想法是最好的?

0 投票
0 回答
140 浏览

multithreading - JRuby 线程性能

我编写了一个脚本来测试 JRuby 的多线程性能。该脚本在 4 核机器和其他机器上运行,我一直得到令人失望的结果。这是脚本和结果。有人可以看看脚本是否有问题或解释为什么会这样吗?我认为在对 Global Interpreter Lock 的依赖较少(或不依赖)的情况下,多线程性能应该比这更好。

这是结果,单线程与多线程交错。请注意,多线程性能始终是单线程所需时间的两倍:

*修改为puts退出线程