为什么python gstreamer会在我的脚本顶部没有"gobject.threads_init()"的情况下崩溃?

Rya*_*son 11 python gobject thread-safety gstreamer

我编写了一个python脚本来使用gstreamer(pygst和gst模块)来计算replaygain标签,并且它与各种gobject错误不一致.我发现你可以通过在脚本顶部放置以下样板来解决这个问题:

import gobject
gobject.threads_init()
Run Code Online (Sandbox Code Playgroud)

我试了一下,它运作了.任何人都可以解释为什么这些行是必要的,为什么pygst本身不这样做?

pyf*_*unc 14

因为,您可以在非线程环境中使用gobject.这并不罕见.在线程环境中使用gobject时,需要通过调用gobject.threads_init()显式初始化.这也将确保调用何时"C"函数,释放GIL.

同样来自功能文档:

threads_init()函数初始化了gobject模块中Python线程的使用.此函数与gtk.gdk.threads_init()函数不同,因为该函数还初始化gdk线程.

基本上,您明确告诉gobject模块您将使用线程并相应地初始化它.

  • 或者更直言不讳地说,为什么pygst不包含这行代码,这是在不崩溃的情况下工作所必需的? (5认同)
  • 我会说除了应用程序之外,这不是pygst的工作.如果每个库/绑定都这样做,那么每次加载它时都会再次完成. (2认同)