问题标签 [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、内存泄漏),我需要将应用程序转换为threading
应用程序。multiprocessing
幸运的是,线程非常孤立,仅通过Queue.Queue
s 进行通信。这个原语也可用,multiprocessing
所以一切看起来都很好。现在,在我进入这个雷区之前,我想就即将出现的问题获得一些建议:
- 如何确保我的对象可以通过
Queue
? 我需要提供一些__setstate__
吗? - 我可以依靠
put
立即返回(如使用threading
Queue
s)吗? - 一般提示/提示?
- 除了Python 文档之外还有什么值得一读的吗?
ruby - 是否可以禁用 YARV 的全局解释器锁?
这比其他任何事情都更令人好奇(我应该完全放弃它并尝试 jRuby),但是是否可以禁用 YARV ruby 的全局解释器锁和任何其他相关的锁?
我认为这会“使您的保修失效”,因为一些 YARV Ruby 的库不是线程安全的,但它会导致任何其他问题吗?
python - 从多个线程调用 NumPy 的 C API 函数有什么影响?
这是一项有风险的业务,我理解 Global Interpreter Lock 是并行性的强大敌人。但是,如果我使用NumPy 的 C API(特别PyArray_DATA
是 NumPy 数组上的宏),从多个并发线程调用它是否有潜在的后果?
请注意,我仍将拥有 GIL,而不是通过NumPy 的线程支持发布它。此外,即使 NumPy 不保证线程安全但PyArray_DATA
在实践中是线程安全的,这对我来说已经足够了。
我在 Linux 上运行 Python 2.6.6 和 NumPy 1.3.0。
python - Python 线程和 GIL
我正在阅读有关 GIL 的信息,但它从未真正指定这是否包括主线程(我假设是这样)。我问的原因是因为我有一个带有修改字典的线程设置的程序。主线程根据玩家输入添加/删除,而线程循环数据更新和更改数据。
然而,在某些情况下,一个线程可能会遍历字典键,在那里人们可以删除它们。如果有一个所谓的 GIL 并且它们按顺序运行,为什么我会收到 dict changed 错误?如果假设一次只运行一个,那么从技术上讲这不应该发生。
任何人都可以对这样的事情有所了解吗?谢谢你。
python - 从python获取全局解释器锁
是否可以从 python 代码中获取全局解释器锁?还是纯粹在C端实现的?
python - python 主线程的 PyThreadState* 是否应该为 NULL?
我有一个调用 c++ 库的 python 程序,它希望释放所有 python 锁,以便其他 python 线程可以运行。
使用PyEval_SaveThread
并且PyEval_ReleaseThread
我得到线程状态为NULL的错误:
然而,底层函数似乎很乐意接受 NULL 状态:
python - 与 7 个请求线程相比,CherryPy 的基准测试速度慢 60 倍,有 8 个请求线程
我很好奇为什么在使用ab
, -c 7
(7 个并发线程)对 Python Web 服务器 CherryPy 进行基准测试时,它可以提供 1500 个请求/秒(大约是我所期望的),但是当我更改为-c 8
它时,它会下降到 25 个请求/秒。我在具有四个运行 Python 2.6 的内核的 64 位 Windows 机器上运行 numthreads=10 的 CherryPy(但如果我使用 numthreads=8 或 20 并没有什么不同)。
我半怀疑 Python GIL 是问题的一部分,但我不知道为什么它只在我达到 8 个并发请求线程时才会发生。在四核机器上,我希望它可能会更改为-c 4
,但事实并非如此。
我正在使用web.py附带的单文件 CherryPy Web 服务器,这是我正在测试的 WSGI 应用程序:
7 个和 8 个并发线程的ab
输出是:
python - 是否可以在阻塞并可能回调 Python 的 C 函数之前释放 GIL?
我正在包装一个执行阻塞操作(选择)然后处理传入消息的 C 函数。我的理解是,当 C 函数要阻塞时,在允许其他线程运行的同时调用它的正确方法是:
但是,这个函数碰巧将回调指针作为参数。在处理由 C 函数预处理的传入消息时调用此回调。我已经成功地将这个回调包装在一个调用的函数中PyEval_CallObject()
,允许我向它传递一个 Python 回调。
现在我正在添加线程支持,我想知道是否可以同时:
- 在调用此阻塞操作之前释放 GIL。
- 让这个阻塞操作安全地回调到 python 解释器中。
这会引起问题吗?如果是这样,有没有办法解决它?
谢谢。
python - 解释性语言如何避免使用全局解释器锁 (GIL)?
CPython 使用全局解释器锁。Linux 已经删除了Big Kernel Lock的所有痕迹。这些锁的替代品是什么?一个系统如何才能充分利用真正的多核或多处理器系统而不使一切都陷入停顿?
python - 销毁子解释器后释放 GIL
我将 Python 3.2 嵌入到 C++ 应用程序中,并且我有几个子解释器在程序中的不同时间运行(由创建Py_NewInterpreter
)。他们在不同时间获取和释放 GIL,但是当我想销毁其中一个子解释器时遇到了问题。
要销毁子解释器,您必须获得 GIL。所以我这样做:
然后我用
你会认为它会释放 GIL,因为持有它的东西被摧毁了。但是,文档Py_EndInterpreter
说:
给定的线程状态必须是当前线程状态。请参阅下面的线程状态讨论。当调用返回时,当前线程状态为 NULL。(全局解释器锁必须在调用此函数之前保持,并且在它返回时仍然保持。)
因此,如果我在销毁子解释器时必须持有 GIL,并且销毁子解释器将其设置为 NULL,并且我必须让获取 GIL 的线程释放它,那么在销毁子解释器后如何释放 GIL ?