gpt4 book ai didi

python - 在Python中处理另一个线程中的信号

转载 作者:行者123 更新时间:2023-12-01 05:28:34 26 4
gpt4 key购买 nike

我有一个在两个线程中运行的 PyGtk (GTK+ 3) 应用程序:

  • 线程A是一个主应用线程,它执行Gtk.main()并因此处理Gtk的事件/信号。
  • 线程B是一个PulseAudio事件线程,它异步处理所有PA的内容。

在某些情况下,有必要让线程 B 的回调处理的事件在 Gtk 对象中执行某些操作。 Python的问题在于GIL一次只能运行一个线程,因此不可能直接更改任何与 Gtk 相关的内容 - 这会导致死锁。

解决方案可能是调用 Gdk.threads_init() 来允许为 Gtk 提升 GIL,但这似乎会导致竞争条件,显然 Gtk 不够线程安全。

我想要做的是“展平”事件处理,以便线程 B 留下一些东西(事件/信号?)供线程 A 拾取和处理。在这种情况下,线程B不会被此操作阻塞。据我了解,Python 的信号机制并非如此,因为它同步处理信号。

所以我的问题是:如何创建一种可由 Gtk 的主循环拾取并由线程 A 代码处理的自定义事件?

最佳答案

Gtk 不是线程安全的,你必须编写代码以确保它是线程安全的。

我不知道您使用的是哪个版本的 pygtk,但在 GUI 线程上对操作进行排队的最简单方法是使用 idle_add:

http://www.pygtk.org/pygtk2reference/gobject-functions.html#function-gobject--idle-add

它是 Gtk 主循环中的一个函数,并将在它的线程上执行。

编辑:这只是在 GUI 线程上调用函数的最简单方法。如果您想要创建自定义 gobject 信号,我相信(但不是 100% 确定)信号处理程序将在 GUI 线程上调用。

关于python - 在Python中处理另一个线程中的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20844540/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com