返回介绍

9.2 多线程

发布于 2024-01-25 22:02:55 字数 1280 浏览 0 评论 0 收藏 0

HDF5对线程级别的并发没有本地支持。虽然你可以安全地在多线程程序中使用HDF5(和h5py),但在效率上没有什么提升。对于很多应用程序来说,这并不是一个问题。以GUI应用为例,它大多数时间都在等待用户输入。

在我们开始之前,回顾一些Python世界的多线程编程的基本概念是很重要的。Python自身包含了一个单一的主锁用于保护对解释器内部函数的访问,称为全局解释器锁(GIL)。该锁将多个线程对资源的访问序列化,如对象引用计数等。你可以在Python程序中有任意多个线程,但一次只有一个可以使用解释器。

这没什么大不了的,特别是当程序是GUI或基于Web的应用时,大多数时间都在等待事件。在这种情况下,I/O线程在等待,GIL被“释放”,其他线程就可以使用解释器。

h5py使用了类似的概念。对HDF5的访问被一个锁序列化了,所以一次只有一个线程能够访问HDF5库。和Python其他的I/O机制不同,所有对HDF5库的访问都是“阻塞”的。一旦发生一个HDF5调用,GIL直到其完成都不会被释放。

图9-1显示了其工作模式。如果你有多个线程在运行,如果其中一个进行了HDF5调用(比如,将一个大数据集写入磁盘),其他线程都无法继续,直到调用完成。

图9-1 基于线程的HDF5程序概览

h5py模块是“线程安全”的,也就是说你可以安全地在线程之间共享对象而不会导致崩溃,也不会发生全局状态导致某个线程影响另一个线程的事情。但是某些高级操作不保证原子性。因此推荐你用递归锁管理自己的HDF5对象的访问。

这里有一个例子。我们将创建一个共享的HDF5文件,两个线程会进行一些计算并将结果写入文件。对文件的访问由一个threading.RLock类的实例管理:

提示


 有一种被称为“线程安全”的HDF5。这是一个HDF5库自身的编译期选项。使用它不会有任何伤害,但它对于h5py的线程安全不是必须的。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文