Почему сбой python gstreamer без "gobject.threads_init()" в верхней части моего script?

Я написал python script, чтобы использовать gstreamer (pygst и gst модули) для вычисления тегов replaygain, и он сбой непоследовательно с различными ошибками gobject. Я нашел где-то, что вы можете исправить это, поставив следующий шаблон в верхней части вашего script:

import gobject
gobject.threads_init()

Я попробовал, и это сработало. Может ли кто-нибудь объяснить, почему эти строки необходимы, и почему pygst не делает этого сам?

Ответ 1

Потому что вы можете использовать gobject в среде без потоковой передачи. Это не редкость. Когда вы используете gobject в потоковой среде, вам нужно явно инициализировать, вызывая gobject.threads_init(). Это также гарантирует, что при вызове функций "C" GIL освобождается.

Также из документа функции:

Функция threads_init() инициализирует использование Python потоки в модуле gobject. Эта функция отличается от gtk.gdk.threads_init() как эта функция также инициализирует gdk потоки.

В принципе, вы четко укажете модулю gobject, что вы собираетесь использовать потоки и инициализировать его соответствующим образом.