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

1

11

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?

Homolographic answered 23/9, 2010 at 22:27 Comment(0)
L
14

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.

Loredo answered 23/9, 2010 at 23:3 Comment(3)
But it seems that the python gstreamer module tries to use threading no matter what, as evidenced by the crashes that occur when I don't call threads_init(). So if it always tries to use threading, shouldn't it always initialize it?Homolographic
Or to put it more bluntly, why doesn't pygst include this line of code, which is required for it to work without crashing?Homolographic
I'd say it's not pygst's job to do that but the application's. If every library/binding did that, it would get done again every time you load one.Malachi

© 2022 - 2024 — McMap. All rights reserved.