问题标签 [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 回答
1496 浏览

pypy - PyPy 中的 GIL 在哪里?

PyPy GIL 是 RPython 中 PyPy 解释器实现的一部分,还是 translate.py 自动添加的东西?即,如果我要在 RPython 中编写自己的新语言解释器并通过 translate.py 运行它,它会先验地受制于 GIL,还是取决于我的解释器代码?

0 投票
2 回答
1337 浏览

python - file.read() 多处理和 GIL

我已经读过用 C 实现的某些 Python 函数,我假设它们包括 file.read(),可以在它们工作时释放 GIL,然后在完成时将其恢复,这样做可以利用多个内核,如果它们'重新可用。

我正在使用多进程来并行化一些代码,目前我有三个进程,父进程,一个从文件读取数据的子进程,以及一个从第一个子进程传递给它的数据生成校验和的子进程。

现在,如果我理解这一点,似乎创建一个新进程来读取文件就像我目前正在做的那样是不必要的,我应该在主进程中调用它。问题是我是否理解这一点,我是否会在主进程或单独的进程中保持读取以获得更好的性能?

因此,鉴于我的功能是读取和管道要处理的数据:

我认为这肯定会使用多个内核,但也会引入一些开销:

但现在我想知道这样做是否也会使用多个内核,减去开销:

任何人对哪个更快以及出于什么原因的任何见解将不胜感激!

0 投票
1 回答
982 浏览

python - 带有嵌入式 python 模块的 C++ 中的多线程

我正在尝试通过启动一个boost线程来创建一个多线程程序,该线程调用一个函数,该函数又调用一些python模块,但程序挂在那里,因为它获得了一些PyGILState_Ensure()锁并无限期地等待它释放。你能请告诉我这里有什么问题。

是的,实际上一个 python 模块调用我的 c++ 代码,它在单独的线程中调用另一个 python 模块,这就是为什么我认为它等待 PyGIL 释放导致死锁,所以,有没有使用补丁删除 PyGIL 的解决方案?

0 投票
2 回答
1025 浏览

multithreading - mod_wsgi 是否在单个 python 解释器中运行?

我有一个 django 应用程序,它严重依赖于线程,无论我添加多少进程或线程到WSGIDaemonProcess.

我在那里找不到是/否的答案,我想知道。会不会是 mod_wsgi 对每个请求都使用相同的解释器,所以由于 GIL 限制,我在瓶颈中运行?

如果是这样,您会推荐其他可以帮助我解决此限制的方法吗?

0 投票
3 回答
1167 浏览

python - Could a C extension for multithreaded Python boost performance?

I have heard of Python's GIL problem, which states that there can only be one Python thread executing the Python bytecode at one time in a multicore machine. So a multithreaded Python program is not a good idea.

I am wondering if I can write a C extension that uses pthread to potentially boost the performance of my program. I'd like to create a thread in my C extension and make it runs in parallel with Python's main thread.

My assumption is that the Python main thread will do things more related to IO, while the pthread in my C extension will spend most of its time doing computation. The Python main thread communicates with the thread in the C extension using a queue (like a producer consumer model).

Is there any difference between multithread with Python and C extension?

0 投票
2 回答
25333 浏览

python - Python中的绿色线程和线程

正如维基百科所说

绿色线程在不依赖任何本机操作系统功能的情况下模拟多线程环境,并且它们在用户空间而不是内核空间中进行管理,使它们能够在没有本机线程支持的环境中工作。

Python 的线程被实现为pthreads (kernel threads),并且由于全局解释器锁 (GIL),Python 进程一次只运行一个线程。

[问题]但是在Green-threads(或所谓的greenlet或tasklets)的情况下,

  1. GIL对他们有影响吗?一次可以运行多个greenlet吗?
  2. 使用greenlets或tasklet有什么陷阱?
  3. 如果我使用greenlets,一个进程可以处理多少个?(我想知道,因为在单个进程中,您最多可以打开 *ix 系统中设置的ulimit-s-v)线程。)

我需要一点洞察力,如果有人能分享他们的经验,或者引导我走上正确的道路,那将会有所帮助。

0 投票
1 回答
89 浏览

python - Python GIL:表达式中的所有参与者是否在表达式期间都增加了引用计数?

假设我有一个简单的 C++ 类:

Widget::sleep块,所以我想释放 GIL 以便 Python 可以做一些其他的事情,所以我包装Widget::sleep在一个这样的函数中:

为了完整起见,绑定代码如下所示:

我有一个简单的 Python 脚本,如下所示:

表达式中的所有参与者是否在表达式期间都增加了他们的引用计数?c.x在使用时唯一的引用C.fooc,后面的行t.start()方便地删除。由于pyWidgetSleep释放 GIL,del c.x可能会减少对Widget实例的最后引用,从而导致未定义的行为。


我无法在我的机器上进行此中断,这似乎很好地表明它可以按我的预期工作,但引用计数没有记录到这种清晰程度(或者,至少,我可以' t 似乎找到它)。CPython 的相关部分似乎是PyEval_EvalCodeEx,看起来它适用Py_INCREF于函数调用中涉及的所有参数,但我可能完全不关心那个。

0 投票
1 回答
1710 浏览

python - 一个线程安全的 memoize 装饰器

我正在尝试制作一个可与多个线程一起使用的 memoize 装饰器。

我知道我需要将缓存用作线程之间的共享对象,并获取/锁定共享对象。我当然要启动线程:

工人在哪里:

当然,当我同时向多个线程发送一个装饰有 memo 函数(如this )的函数时,问题就开始了。

如何将备忘录的缓存实现为线程之间的共享对象?

0 投票
1 回答
1051 浏览

python - 强制 GIL 不切换线程

我正在分析一些多线程CPython代码。
为了测量执行特定代码段所需的时间,我想强制GIL(全局解释器锁)不在该段的线程之间切换。如何才能做到这一点?

更新:
假设以下伪代码:

我担心的是解释器会在“时间关键”分析期间切换线程。

0 投票
1 回答
2302 浏览

python - Python 和真正的并发线程

我已经阅读了几个小时,我可以完全弄清楚 python 多线程是如何比单线程更快的。

这个问题确实源于 GIL。如果有 GIL,而且任何时候只有一个线程真正在运行,那么多线程怎么能比单线程快呢?

我读到了一些操作 GIL 被释放(比如写入文件)。这就是使多线程更快的原因吗?

关于绿叶。这些对并发有什么帮助?到目前为止,我看到的所有目的都是在函数和不太复杂的屈服函数之间轻松切换。

编辑:在世界上,像 Tornado 这样的服务器如何处理数千个同时连接?