为什么我的Python GStreamer脚本没有在顶部使用"gobject.threads_init()"就会崩溃?

11

我编写了一个用于计算回放增益标签的Python脚本,使用了gstreamer(pygst和gst模块),但是它会不时地崩溃,出现各种gobject错误。我在某个地方找到了一个解决方法,可以通过将以下样板放置在脚本顶部来解决这个问题:

import gobject
gobject.threads_init()

我尝试了一下,它起作用了。有人可以解释一下为什么这些行是必要的,以及为什么pygst自己不做这个吗?

1个回答

14
因为您可以在非线程环境中使用gobject,这并不罕见。当您在线程环境中使用gobject时,需要通过调用gobject.threads_init()来显式初始化。这也将确保在调用"C"函数时,GIL被释放。
此外,从函数文档中可以看到:
threads_init()函数初始化了gobject模块中Python线程的使用。该函数与gtk.gdk.threads_init()函数不同,因为该函数还初始化了gdk线程。
基本上,您告诉gobject模块您将使用线程,并相应地进行初始化。

但是似乎Python的GStreamer模块无论如何都会尝试使用线程,这可以通过不调用“threads_init()”时发生的崩溃来证明。因此,如果它总是尝试使用线程,那么它不应该总是初始化它吗? - Ryan C. Thompson
5
直白地说,为什么pygst没有包括这行代码,而这行代码是必需的,才能避免崩溃? - Ryan C. Thompson
2
我认为这不是 pygst 的工作,而是应用程序的工作。如果每个库/绑定都这样做,那么每次加载一个库时都需要重新完成这项工作。 - XTL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接