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 的不同的队列,它充当传输安装进度更新的介质。

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

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.