Search code examples
pythonthread-safetygstreamergobject

Why does python gstreamer crash without "gobject.threads_init()" at the top of my script?


I have written a python script to use gstreamer (pygst and gst modules) to calculate replaygain tags, and it was crashing inconsistently with various gobject errors. I found somewhere that you could fix this by putting the following boilerplate at the top of your script:

import gobject
gobject.threads_init()

I tried it, and it worked. Can anyone explain why these lines are necessary, and why pygst doesn't do this itself?


Solution

  • Because, you can use gobject in a non threading environment. This is not unusual. When you use gobject in a threading environment, you need to explicitly initialize by calling gobject.threads_init(). This will also ensure that the when "C" functions are called, the GIL is freed.

    Also from the function document :

    The threads_init() function initializes the use of Python threading in the gobject module. This function is different than the gtk.gdk.threads_init() function as that function also initializes the gdk threads.

    Basically, you tell gobject module explicitly that you are going to use threading and initialize it accordingly.