gil相关内容

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

当通过Python的subprocess模块调用一个耗时较长的linux二进制文件时,是否会释放GIL? 我想并行化一些从命令行调用二进制程序的代码.使用线程(通过 threading 和 multiprocessing.pool.ThreadPool)还是 multiprocessing 更好?我的假设是,如果 subprocess 释放 GIL,那么选择 threading 选项会更好. ..
发布时间:2022-01-18 16:06:46 Python

为什么Java虚拟机中没有GIL?为什么 Python 这么需要一个?

我希望有人能提供一些关于 Java 虚拟机的根本不同之处的见解,它允许它很好地实现线程而无需全局解释器锁 (GIL),而 Python 需要这样一个邪恶. 解决方案 Python(语言)不需要 GIL(这就是为什么它可以完美地在 JVM [Jython] 和 .NET [IronPython] 上实现,并且那些实现多线程自由).CPython(流行的实现)一直使用 GIL 来简化编码(尤其 ..
发布时间:2022-01-16 12:01:40 Java开发

为什么 numpy 计算不受全局解释器锁的影响?

我正在尝试决定是否应该使用多处理或线程,并且我学到了一些关于 全局解释器锁.在这篇不错的博文中,似乎多线程不适合繁忙的任务.但是,我也了解到某些功能,例如 I/O 或 numpy,不受 GIL 的影响. 谁能解释一下原因,以及我如何确定我的(可能是相当 numpy-heavy)代码是否适合多线程? 解决方案 许多 numpy 计算不受 GIL 影响,但不是全部. 在不需要 Py ..
发布时间:2022-01-12 13:04:30 Python

在执行 I/O 密集型任务时,20 个进程中的 400 个线程优于 4 个进程中的 400 个线程

实验代码 下面是实验代码,它可以启动指定数量的工作进程,然后在每个进程内启动指定数量的工作线程,并执行获取 URL 的任务: 导入多处理导入系统进口时间导入线程导入 urllib.request定义主():进程 = int(sys.argv[1])线程 = int(sys.argv[2])urls = int(sys.argv[3])# 启动流程工作者.in_q = multiproces ..
发布时间:2022-01-12 12:38:00 Python

CPython 中的全局解释器锁 (GIL) 是什么?

什么是全局解释器锁,为什么会出现问题? 围绕从 Python 中删除 GIL 已经产生了很多噪音,我想了解为什么这如此重要.我自己从来没有写过编译器和解释器,所以不要吝啬细节,我可能需要他们来理解. 解决方案 Python 的 GIL 旨在序列化从不同线程对解释器内部的访问.在多核系统上,这意味着多线程不能有效地利用多核.(如果 GIL 没有导致这个问题,大多数人不会关心 GIL—— ..
发布时间:2021-11-30 23:45:30 Python

Python 中 GIL 的新实现是否处理了竞争条件问题?

我已阅读一篇关于多线程的文章在 Python 中,他们尝试使用同步来解决竞争条件问题.我已经运行下面的示例代码来重现竞争条件问题: 导入线程# 全局变量 xx = 0定义增量():"""增加全局变量 x 的函数"""全球 xx += 1定义线程任务():"""线程任务调用增量函数 100000 次."""对于 _ 范围内(100000):增量()def main_task():全球 x# 设置全 ..
发布时间:2021-07-02 18:44:22 Python

CPU 密集型任务中的多线程和单线程性能问题

以下两个单线程和多线程脚本在我输入一个大数字(如 555550000 )时占用相同的时间 单线程 导入线程,时间a=[]def print_factors(x):对于范围内的 i (1, x + 1):如果 x % i == 0:a.append(i)n=int(input("请输入一个大数字"))print ("开始时间是 %s" % ( time.ctime(time.time()) ) ..
发布时间:2021-06-04 20:34:04 Python

python GIL的多线程示例

我已经阅读了很多关于编写多线程代码时 Python GIL 业务有多“糟糕"的文章,但我从未见过示例.有人可以给我一个基本的例子,说明在使用线程时 GIL 何时会导致问题. 谢谢! 解决方案 多线程的主要原因之一是程序可以利用多个 CPU(和/或 CPU 上的多个内核)来计算更多每秒操作数.但是在 Python 中,GIL 意味着即使您有多个线程同时进行计算,在任何给定时刻实际上只有 ..
发布时间:2021-06-04 20:07:28 Python

asyncio.sleep 如何不阻塞线程?

我一遍又一遍地阅读“Luciano Ramalho"的“Fluent Python",但我无法理解 asyncio.sleep 在 asyncio 中的行为. 书中有一部分说: 切勿在 asyncio 协程中使用 time.sleep,除非您想阻塞主线程,否则会冻结事件循环,也可能冻结整个应用程序.(...) 它应该从 asyncio.sleep(DELAY) 产生. 另一方面: ..
发布时间:2021-06-04 20:02:47 Python

VBA是否使用全局解释器锁定?所有解释语言都需要一种吗?

可以使用 Application.Run 方法将VBA类(COM对象)从一个托管的VBA进程传递到另一个(例如,一个Excel.exe实例传递到另一个).这意味着第二个进程(线程2)将有权访问第一个进程(线程1)中定义的代码. 因此,第二个线程可能会在线程1的对象上调用一个方法,该对象使用第一个线程的解释器运行,因此线程1的解释器同时从线程1和线程2调用. 这对任何人来说都不足为奇,但 ..
发布时间:2021-05-16 19:48:21 其他开发

我需要在Cython中使用`nogil`吗?

我有一些想尽快运行的Cython代码.为此,我需要释放GIL吗? 假设我的代码与此类似: 将numpy导入为np#琐碎的定义仅供参考!cdef double some_complicated_function(double x)nogil:返回xcdef void func(double [:] input)nogil:cdef double [:] array = np.zeros_li ..
发布时间:2021-04-28 18:35:29 Python

Python线程并没有提高速度

为了加快某些列表处理逻辑的速度,我编写了一个装饰器,该装饰器将1)拦截传入的函数调用2)获取其输入列表,将其分成多段4)将这些段传递给单独线程上的原始函数5)结合输出和返回 我认为这是一个很好的主意,直到我对其进行编码并看到速度没有变化!即使我看到htop上有多个内核忙,但多线程版本实际上比单线程版本慢. 这与臭名昭著的cpython GIL有关吗? 谢谢! 来自线程导入线程将 ..
发布时间:2021-04-24 21:11:12 Python

从C调用python函数作为回调.处理GIL的正确方法是什么?

我正在使用 cytpes 来包装C api.api函数之一允许您注册回调.我正在使用 CFUNCTYPE 指定函数的类型,并从我的python库的用户提供的python函数中创建 CFUNCTYPE 的实例,然后将其传递给C函数(通过 ctypes api调用). 我知道 ctypes 调用会释放 GIL .我想知道当C库函数调用我的python回调函数时会发生什么. ctypes 是否重新 ..
发布时间:2021-04-21 19:04:44 Python

没有GIL的cython memoryviews切片

我想释放GIL,以并行化cython中的循环,在该循环中,不同的memoryviews片段将传递给循环内的某个函数.代码如下: cpdef void do_sth_in_parallel(bint[:,:] input, bint[:] output, int D): for d in prange(D, schedule=dynamic, nogil=True): ..
发布时间:2020-06-16 18:54:49 其他开发

Ruby Fiddle和全局解释器锁(GIL)

我正在使用小提琴进行呼叫用于某些线性代数计算(Mac OSX). 模块定义类似于 module BLAS extend Fiddle::Importer dlload $BLAS_PATH extern 'void cblas_dgemm(int, int, int, int, int, int, double, double*, int, double*, ..
发布时间:2020-06-16 18:54:45 其他开发

Python GIL和全局变量

在python中,我定义了一个全局变量,该变量由不同的线程读取/递增.由于存在GIL,如果不使用任何类型的锁定机制,是否会引起问题? 解决方案 GIL仅要求解释器在另一个线程可以接管之前完全执行一条字节码指令.但是,没有理由假设增量操作是一条指令.例如: >>> import dis >>> dis.dis(compile("x=753","","exec")) 1 ..
发布时间:2020-06-16 18:54:40 Python

PyPy中的GIL在哪里?

PyPy GIL是RPython中PyPy解释器实现的一部分,还是translate.py自动添加的东西?也就是说,如果我要用RPython编写自己的新语言解释器并通过translate.py运行它,那么它是否应该先于GIL,还是取决于我的解释器代码? 解决方案 GIL处理由module/thread/gil.py插入您的PyPy签出中.这是一项可选的翻译功能,仅在启用线程模块时才添加.就 ..
发布时间:2020-06-16 18:54:35 其他开发

Python GIL和多线程

我想将我的单线程应用程序与工作线程数分开.只是一个问题-该动作的执行情况如何?如果GIL阻止python同时执行多个线程, (从c/c ++的角度来看)另一点-无论如何,我知道每个线程只能以独占方式执行,因此在比python解释器低的级别上,我有相同的限制. 总结:在任务切换过程中,python线程的效率是否会低于"native"线程? 解决方案 不用担心GIL.根据您程序执行 ..
发布时间:2020-06-16 18:54:31 Python