问题标签 [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 - 如何解决/绕过似乎与 GIL 相关的锁定问题
两个线程之间的模糊锁定似乎与全局解释器锁定或其他一些“幕后锁定”有关,我不知道如何继续故障排除。任何如何消除锁定的提示将不胜感激。
该问题在更大的代码集中重现(不规则且有些随机)。代码是严格的python。Python 版本是 2.6.5(在 Linux 上)。当锁定发生以下情况时,数小时的故障排除已减少问题:
- 该程序只有两个正在运行的线程
- 线程同时调用由单个 threading.RLock 保护的方法
- 线程 1 通过 acquire() 获得了锁 [加上其他一些锁]
- 线程 2 调用了 acquire() 并确认正在等待锁
- 线程 1 能够使用 print() 向控制台打印,但是它被一个简单的非阻塞库调用锁定
#5 中的攻击性调用是函数 unicode.encode,它应该是非阻塞的。线程 1 中线程锁定位置的以下代码将(如预期)打印“A”和“B”:
但是,以下只会打印“A”并阻塞线程:
这对我来说毫无意义。两个线程之间不存在逻辑死锁条件。线程 1 被非阻塞库调用阻塞,该调用不会以任何方式干扰线程 2,线程 2 只是静静地等待获取 RLock。我能想到的线程 1 被阻塞的唯一原因是它正在等待 GIL。
任何想法如何进一步解决这个问题,或者任何机制以某种方式控制或操纵 GIL 操作作为解决方法?
编辑:针对样本偏差的一些附加信息(感谢您的回复)。我在追踪时遇到了问题,因为这个问题似乎对任何可能干扰两个线程之间时间的事情都非常敏感。但是,仅使用 -f 选项运行 strace ,经过几次迭代后,我能够获得跟踪。
线程 1 包含这三个调试语句,它们应将两行“CHECK_IN”和“CHECK_TEST”打印到控制台:
这是 strace 的最后一页:
在程序锁定之前,三行代码的输出如下:
因此 strace 显示了线程 1 (#8606) 如何写入 'CHECK_IN' 字符串,并在到达 unicode.encode 调用时进入永远不会返回的等待状态。
顺便说一句,我将在所有模块中进行一些未来的导入,以符合一些较新的 python 约定......
...但我看不出它们应该有什么不同——尤其是当 u'hello' 字符串被显式调用为 unicode 字符串时。
python - numpy 和全局解释器锁
我即将编写一些计算密集型 Python 代码,这些代码几乎肯定会在numpy
的线性代数函数中花费大部分时间。
手头的问题令人尴尬地平行。长话短说,对我来说利用它的最简单方法是使用多个线程。主要的障碍几乎肯定是全局口译员锁(GIL)。
为了帮助设计这一点,有一个心智模型会很有用,在这个模型中,numpy
操作可以预期在其持续时间内释放 GIL。为此,我很感激任何经验法则、注意事项、指针等。
万一这很重要,我在 Linux 上使用 64 位 Python 2.7.1,带有numpy
1.5.1 和scipy
0.9.0rc2,使用 Intel MKL 10.3.1 构建。
python - 在一个线程中运行繁忙的任务时所有线程都挂起
我有一个多线程 python 应用程序,其中产生线程来执行各种任务。这个应用程序已经运行了好几个月,但最近我遇到了一个问题。
其中一个线程启动了一个 pythonsubprocess.Popen
对象,该对象正在运行一个密集的数据复制命令。
当复制命令运行时,整个应用程序最终陷入困境,我的其他线程一次都没有运行几分钟。copy
完成后,一切从中断的地方继续。
我试图弄清楚如何防止这种情况发生。我最好的理论 ATM 是它与我的内核调度进程的方式有关。我添加了调用以setsid()
使复制过程与主 python 应用程序分开安排,但这没有效果。
我假设所有copy.wait()
功能都是一个waitpid()
. 调用是否可能需要很长时间,在此期间该线程持有 GIL?如果是这样,我该如何预防/处理这种情况?我能做些什么来进一步调试呢?
java - 为什么 Python 在多处理或多线程应用程序中不如 Java?
由于 Python 在 GIL 方面存在一些问题,因此 Java 更适合开发多处理应用程序。您能否以您的方式证明 java 比 python 有效处理的确切原因?
python - 将 GILed Python 程序限制为单个 CPU 会提高性能吗?
跟进David Beazley关于 Python 和 GIL 的论文,在基于 Windows 的多核系统中将 Python 程序(带有 GIL 的 CPython 等)限制为单个 CPU 是否是一种好习惯?
它会提高性能吗?
更新: 假设使用了多个线程(不确定是否有区别)
python - 多处理对 urllib2 没用?
我最近尝试使用多处理模块(它是工人池)。我在这里阅读了几个关于多线程(与标准的非线程版本相比减慢了整个过程)和多处理的讨论,但我找不到一个(可能非常简单)问题的答案:
您可以通过多处理加速 url 调用还是不是像网络适配器这样的瓶颈?我没有看到例如 urllib2-open-method 的哪一部分可以并行化,以及它应该如何工作......
编辑:这是我想加快的请求和当前的多处理设置:
python - Python GIL 和线程同步
在阅读了各种解释 GIS 和 Python 线程的文章之后,以及由于 GIL 而在多线程 Python 代码中是否不需要锁?这是一个非常有用的答案,我有一个“最后一个问题”。
理想情况下,如果我的线程仅通过原子(Python VM)指令对共享数据进行操作,例如将项目附加到列表,则不需要锁,对吗?
python - 同时在python中运行多个线程-可能吗?
我正在编写一个应该多次获取 URL 的小爬虫,我希望所有线程同时(同时)运行。
我已经写了一小段代码应该做到这一点。
从 apache 日志来看,线程似乎不是同时运行的,请求之间有一点差距,几乎无法检测到,但我可以看到线程并不是真正并行的。
我读过 GIL,有没有办法绕过它而不调用 C\C++ 代码?我真的不明白 GIL 是如何实现线程化的?python 基本上在下一个线程完成前一个线程后立即解释它?
谢谢。
python - Python 3.2 及更高版本中的 sys.setswitchinterval
Python 3.2 引入了Antoine Pitrou的新 GIL 实现sys.setswitchinterval
,它公开了函数。
什么时候改变它是有用的,为什么?
python - python全局解释器锁GIL问题
我想在网络上提供一项服务,人们可以测试算法的性能,该算法是用 python 编写并在 linux 机器上运行
基本上我想做的是,有一个非常简单的 PHP 处理程序,比如说 start_algo.php,它接受来自浏览器的请求,并在 php 代码中通过 system() 或 popen() (类似于 exec(" python algo.py" ) ) 来发布一个运行python脚本的新进程,我认为这在这部分是可行的
问题是,既然它是一个网络服务,它肯定必须同时为多个用户提供服务,但我对 Global Interpreter Lock GIL http://wiki.python.org/moin/GlobalInterpreterLock 的“标准”感到很困惑' CPython 已经实现,这是否意味着,如果我现在有 3 个用户运行算法(这意味着 3 个分离的进程,如果我错了请纠正我),在特定时刻,只有一个用户正在由 Python 服务口译员和另外 2 人在等轮到他们?
提前谢谢了
泰德