5.4. 跨 Anaconda 线程通信

有些您需要在安装过程中执行的动作可能需要很长时间。例如:扫描磁盘以了解现有分区或下载软件包元数据。为防止您等待并保持响应,Anaconda 在单独的线程中运行这些操作。

Gtk 工具包不支持多个线程的元素更改。Gtk 的主事件循环运行在 Anaconda 进程的主线程中。因此,所有与 GUI 相关的操作都必须在主线程中执行。为此,请使用 GLib.idle_add,这并不总是容易或需要的。pyanaconda.ui.gui.utils 模块中定义的几个帮助程序功能和 decorators 可能会造成困难。

@gtk_action_wait@gtk_action_nowait 修饰符以这样一种方式更改修饰函数或方法,即当调用此函数或方法时,它会自动排队到在主线程中运行的 Gtk 的主循环中。返回值要么返回给调用者,要么被丢弃。

在 spoke 和 hub 通讯中,一个 spoke 会声明何时就绪且不会被阻断。hubQ 消息队列处理此功能,并定期检查主事件循环。当 spoke 变为可访问时,它会向队列发送一条消息来宣布更改,并且该更改不应再被阻止。

当 spoke 需要刷新其状态或完成一个标志时,也是如此。Configuration and Progress hub 有一个名为 progressQ 的不同的队列,它充当传输安装进度更新的介质。

这些机制也用于文本界面。在文本模式中,没有主循环,但可能需要大量事件进行键盘输入。