问题标签 [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.
python - Python GIL 和全局变量
在 python 中,我定义了一个由不同线程读取/递增的全局变量。由于 GIL,如果不使用任何类型的锁定机制,这是否会导致问题?
python - Python - 关于同时使用“多进程”的问题
我想使用 Python 的多处理在不使用锁的情况下进行并发处理(对我而言,锁与多处理相反),因为我想在 Web 请求期间同时从不同资源构建多个报告(通常需要大约 3 秒但使用多处理,我可以在 0.5 秒内完成)。
我的问题是,如果我向网络公开这样的功能并让 10 个用户同时提取同一份报告,我突然同时打开了 60 个解释器(这会导致系统崩溃)。这只是使用多处理的常识结果,还是有一个技巧可以解决这个潜在的噩梦?
谢谢
python - Are there some cases where Python threads can safely manipulate shared state?
Some discussion in another question has encouraged me to to better understand cases where locking is required in multithreaded Python programs.
Per this article on threading in Python, I have several solid, testable examples of pitfalls that can occur when multiple threads access shared state. The example race condition provided on this page involves races between threads reading and manipulating a shared variable stored in a dictionary. I think the case for a race here is very obvious, and fortunately is eminently testable.
However, I have been unable to evoke a race condition with atomic operations such as list appends or variable increments. This test exhaustively attempts to demonstrate such a race:
I have run the test above without failure (100x 100k multithreaded appends). Can anyone get it to fail? Is there another class of object which can be made to misbehave via atomic, incremental, modification by threads?
Do these implicitly 'atomic' semantics apply to other operations in Python? Is this directly related to the GIL?
python - Python:在没有 GIL 的情况下绘制一些数据(matplotlib)
我的问题当然是 GIL。当我在分析数据时,最好在两者之间展示一些图(所以等待结果不会太无聊)
但是 GIL 阻止了这一点(这让我开始问自己 Python 是否是一个好主意)。
我只能显示绘图,等到用户关闭它并在那之后开始计算。显然是浪费时间。
我已经尝试过 subprocess 和 multiprocessing 模块,但似乎无法让它们工作。
对这个有什么想法吗?谢谢
编辑:好的,所以它不是 GIL,而是 show()。
c++ - 使用线程在python中调用多个c++函数
假设我有一个采用整数的 C(++) 函数,并且它使用 python api 绑定到 (C)python,所以我可以从 python 调用它:
现在,我想并行化它。问题是:在这种情况下 GIL 是如何工作的?假设我有一个要处理的数字队列,并且一些工人(threading.Thread
)并行工作,他们每个人都调用从队列中取出的c_module.f(number)
位置。number
与通常情况下的不同之处在于,当 GIL 锁定解释器时,现在您不需要解释器进行评估c_module.f
,因为它是编译的。所以问题是:在这种情况下,处理真的是并行的吗?
python - Python 中的多线程爬虫真的可以加快速度吗?
正在寻找用python编写一个小的网络爬虫。我开始研究将其编写为多线程脚本,一个线程池下载和一个池处理结果。由于 GIL,它实际上会同时下载吗?GIL 如何影响网络爬虫?每个线程会从套接字中提取一些数据,然后转到下一个线程,让它从套接字中提取一些数据,等等……?
基本上我要问的是,在 python 中做一个多线程爬虫真的会给我带来比单线程更多的性能吗?
谢谢!
python - Python 需要 GIL。但是 Jython 和 IronPython 没有。为什么?
为什么不需要 GIL 就可以运行 Jython 和 IronPython 而 Python (CPython) 需要 GIL?
java - 寻找没有 GIL 的强/显式类型语言
是否有任何语言具有像 C++ 中的静态类型检查和 Python 中的现代语法,并且没有 GIL?
我相信,能够显式声明每个变量类型的 Python 3 将“几乎存在”,但 GIL 让我感到难过。
Java 很好,但我需要一些更“可嵌入”的东西,而不需要笨重的 JRE。
更新:任何与 .NET 相关或非开源的东西都是不行的。
更新2:我需要显式+强类型来编写更安全的代码,但会牺牲开发速度。GIL 很重要,因为代码的计算量非常大,并且将在多核服务器上运行,因此它必须有效地使用多个 CPU。
Update3:目标平台是 x86 上的 Linux(Debian)
python - 如何确定适当的检查间隔?
我刚刚开始研究一个有一些 CPU 问题的龙卷风应用程序。CPU 时间将随着时间的推移单调增长,使 CPU 达到 100%。该系统目前设计为不阻塞主线程。如果它需要做一些阻塞和异步驱动程序不可用的事情,它将产生另一个线程来执行阻塞操作。
因此,我们的主线程几乎完全受 CPU 限制,而其他线程几乎完全受 IO 限制。根据我的阅读,这似乎是遇到 GIL 问题的完美方式。另外,我的分析表明我们花费了大量时间等待信号(我假设这__semwait_signal
是正在做的事情),这与 GIL 在我有限的理解中产生的影响是一致的。
如果我使用sys.setcheckinterval
将检查间隔设置为 300,CPU 增长会显着减慢。我要确定的是我是否应该增加检查间隔,将其保持在 300,或者害怕增加它。毕竟,我注意到 CPU 性能变得更好,但我有点担心这会对系统的响应能力产生负面影响。
当然,正确的答案可能是我们需要重新考虑我们的架构以将 GIL 考虑在内。但这不是可以立即完成的事情。那么,我如何确定在短期内采取的适当行动方案呢?
c# - 什么是 C# 的 GIL 版本?
在当前的 CPython 实现中,有一个称为“GIL”或“全局解释器锁”的对象。它本质上是一个互斥体,可以防止两个 Python 线程同时执行 Python 代码。这可以防止两个线程破坏 Python 解释器的状态,但也可以防止多个线程真正一起执行。本质上,如果我这样做:
我不能破坏列表,因为在任何给定时间,只有一个线程正在执行,因为它们必须持有 GIL 才能这样做。现在,列表中的项目可能会以某种不确定的顺序添加,但关键是列表没有损坏,并且总是会添加两件事。
所以,现在到 C#。C# 本质上面临与 Python 相同的问题,那么,C# 是如何防止这种情况的呢?如果有人知道的话,我也有兴趣听听 Java 的故事。
澄清:我对没有显式锁定语句会发生什么很感兴趣,尤其是对 VM 而言。我知道 Java 和 C# 都存在锁定原语——它们也存在于 Python 中:GIL 不用于多线程代码,除了保持解释器正常。我对上面的直接等价物感兴趣,所以,在 C# 中,如果我能记住的话...... :-)
这是另一个例子:
我不想写糟糕的 C# 代码,我理解这些lock
陈述。即使在 Python 中,GIL 也不会为您提供神奇的多线程代码:您仍然必须锁定共享资源。但是 GIL 可以防止 Python 的“VM”被破坏——我感兴趣的是这种行为。