那么,在我的程序开头,我应该运行什么来使其线程安全(或者像我在某些地方读到的那样,线程感知):
from gi.repository import Gtk, Gdk, GLib, GObject
import threading
GLib.threads_init() # ?
GObject.threads_init() # YES!
Gdk.threads_init() # ?
my_app()
def my_threaded_func():
Glib.idle_add(lambda: some_gui_action())
Glib.timeout_add(300, lambda: some_gui_action())
t = threading.Thread(target=my_thread_func)
t.daemon = True
t.start()
Gtk.main()
那么,在我的线程中应该做什么?需要某种锁吗?使用Python的线程库是否安全,还是应该使用GLib、GObject或Gdk中的某些内容?我知道有大量的问题/答案/示例存在,但它们彼此矛盾,不适用于Gtk+ 3,或者不适用于Python,甚至我认为官方文档Python GI(http://lazka.github.io/pgi-docs/)甚至没有提到GObject.threads_init()和Gdk.threads_init()的存在。
Gdk.threads_init()
。你能否提供一个源,说明它已经被弃用了?另外,你能解释一下为什么要使用GLib.idle_add()
而不是Gdk.threads_add_idle()
吗?谢谢。 - jpcgtGObject.threads_init()
而不是GLib.threads_init()
的理由是什么?毕竟我们正在使用GLib.add_idle()
与主线程同步。我读到有人说最好使用并行进程而不是线程。你能发表一下评论吗?再次感谢。 - jpcgt(GLib.threads_init is GObject.threads_init) == True
。这只是一个别名...正如PyGObject维基页面所指出的那样,它与GObject或GLib无关,但仍然因历史原因而存在。您可以将其视为gi.threads_init()
。正如维基页面上也指出的那样,自3.10.2以来不再需要它。 - lazka