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

python - 使用 subprocess 模块是否会释放 python GIL?

当通过Python的模块调用需要相对较长时间的linux二进制文件时subprocess,这会释放GIL吗?

我想并行化一些从命令行调用二进制程序的代码。使用线程(通过threading和 a multiprocessing.pool.ThreadPool)还是更好multiprocessing?我的假设是,如果subprocess发布 GIL,那么选择该threading选项会更好。

0 投票
1 回答
3919 浏览

python - 理解 python GIL - I/O bound vs CPU bound

来自python 线程文档

在 CPython 中,由于全局解释器锁,只有一个线程可以一次执行 Python 代码(即使某些面向性能的库可能会克服这个限制)。如果您希望您的应用程序更好地利用多核机器的计算资源,建议您使用多处理。但是,如果您想同时运行多个 I/O 密集型任务,线程仍然是一个合适的模型。

现在我有一个像这样的线程工作者

这里w.analyze()做两件事

  1. requests使用库抓取 url
  2. pyv8使用javascript 库分析抓取的 html

据我所知,1受 I/O 限制且2受 CPU 限制。

这是否意味着,申请了 GIL 2,我的程序将无法正常运行?

0 投票
2 回答
1888 浏览

python - 多线程网络服务器上的 python + wsgi:这是竞争条件吗?

假设我写了一个 wsgi application。我使用多线程配置运行此应用程序Apache2,以便我的应用程序在每个进程的多个线程中运行:Linuxmod-wsgi

申请代码为:

模块 foo.py:

我只是用变量创建了一个竞争条件a吗?我猜,a是一个模块级变量,它存在于线程中foo.py并且在线程之间是相同的(共享的)?

更多理论问题由此衍生:

  1. 同一进程中的并发线程访问并修改同一a变量,所以我的示例不是线程安全的?
  2. 如果我的网络服务器是,我在 Linux 上的应用程序的每个线程都是使用API 和函数Apache在 C 级创建的,必须执行的是某种 python 解释器的主要函数?还是 Apache 以某种方式保护我免受此错误的影响?pthreadspthread
  3. 如果我在像Tornado's这样的 python 编写的网络服务器上运行它会HTTPServer怎样?用python编写的Web服务器将线程实现为python级threading.Thread对象,并application在每个线程中运行函数。所以,我想这是一个竞争条件?(我还想,在这种情况下,我可以从实现下面的底层 C 级抽象,pthreadsthreading.Thread担心 python 函数,因为解释器不允许我修改 C 级共享数据并搞砸它的功能。所以唯一的方法是对我来说打破线程安全就是处理全局变量?是吗?)
0 投票
1 回答
2579 浏览

python - 当有 GIL 时,你可以在 Python 中竞争条件吗?

我的理解是,由于 cPython 中的全局解释器锁,任何时候都只能执行一个线程。这是否不会自动保护免受竞争条件的影响,例如丢失更新问题?

为了清楚起见,我是从理论的角度问的。如果没有同步,我永远不会编写线程代码。

0 投票
0 回答
848 浏览

python - Python C 扩展 OpenMP

当我尝试访问由我自己的 OpenMP C++ 扩展返回的变量时,我在 python 解释器中遇到了分段违规。

我找到的所有解决方案都使用 ctypes 或 cython(我不能使用)。http://snatverk.blogspot.de/2012/03/c-parallel-modules-for-python.html展示了一个启用 OpenMP 的 python 扩展的小例子。尽管我尝试像示例中那样实现我的 for 循环,但它仍然不起作用。

我的代码扩展代码功能如下所示:

函数 matcher_match() 接收两个列表,names 和 namesB。我检查名称和名称B(它们的浮点属性)的每个组合是否存在由函数test_pair_ij()指示的特定条件。该函数是一个纯 C(++) 实现,不会回调到 python。

C 扩展被调用:

当列表名称和名称B 相当小时,代码运行正常。但是对于更大的列表,我无法再在 python 代码中访问 matchResult。当我尝试这样做时,我得到了分段违规(我猜这是在 python 解释器内部)。我已经在没有 openmp 的情况下重新编译了 C 扩展,它再次运行正常,即使是更大的列表。

我想问题是我从我的扩展访问的 python 变量的内存中的一些混乱。这可能与 GIL 有关,尽管我正在发布和获取它。在这种情况下,我是否需要将更多变量设为私有?对此还有其他想法吗?

编辑:修复函数 test_pair_ij 的调用参数。

编辑 2:存储 matchIdcs 的固定代码

答案

代码正在释放 GIL 并调用PyList_SetItem(matchIdcs, i, matchVal); 正在修改不允许的 python 结构(请参阅http://docs.cython.org/src/userguide/external_C_code.html#releasing-the-gil)。

0 投票
1 回答
1559 浏览

python - 我在哪里可以找到发布 GIL 的 numpy 函数列表?

我发现了几个 SO 问题以一种或另一种方式询问这个问题,但实际上他们都没有给出一个列表或参考一个。

这个问题指的是一个 wiki 页面,但是虽然 wiki 页面讨论GIL 和多线程,但它没有给出 GIL 发布函数的列表。

此邮件列表帖子表明找出答案的唯一方法是阅读 numpy 源代码。真的吗?

0 投票
2 回答
252 浏览

python - collections.deque "pop" 方法会释放 GIL 吗?

我有一段代码,其中有一个处理线程和一个监视线程。在处理线程中,我调用了 collections.deque.popleft 函数。我想知道这个函数是否释放 GIL,因为即使处理函数在 popleft 函数上被阻塞,我也想运行我的监视器线程

0 投票
4 回答
4831 浏览

python - python中的多线程:大多数时候它真的性能高效吗?

据我所知,multi-threading在大多数情况下(但不是全部)驱动编程的是性能因素。(无论是 Java 还是 Python)。

我正在阅读这篇关于SO 的启发性文章。GIL文章总结python采用GIL机制;即只有 asingle Thread可以python byte code在任何给定时间执行。这使得single thread应用程序真的更快。

我的问题如下:

如果Thread在给定点只提供一个服务,那么模块multiprocessing是否thread提供了一种方法来克服 GIL 施加的这种限制?如果没有,它们为实际multi-task工作提供了哪些功能

在接受的答案中,上面帖子的评论部分有一个问题,但没有答案?我心里也有这个问题

0 投票
1 回答
27 浏览

python - Python:使用线程处理作业

有一个相当大的多线程 python2 web 应用程序。在主线程中工作业务逻辑,在子线程中主要运行数据库操作。现在没有使用 TreadPoolExecutor,近期也无法实现。我想添加另一个线程,它应该处理一定数量的数据(快速)并将结果存储到数据库中(io 操作)。此操作不会经常执行。

所以,问题是:我应该主要运行睡眠线程并等待事件处理数据,还是在有足够数据时从主线程生成新线程并在处理完成时关闭它?请注意,GIL 已经有相当多的线程在运行以在它们之间切换。

谢谢。

0 投票
3 回答
2387 浏览

python - Python中具有多个线程的多个进程

我听说过“如果您想从并行应用程序中获得最大性能,您应该创建与计算机拥有的 CPU 一样多的进程,并在每个进程中创建一些(多少?)线程”。

这是真的吗?

我写了一段代码来实现这个成语:

这是对的吗?我的do_main_work功能真的会并行运行,不会遇到任何 GIL 问题吗?

谢谢你。