9.2 多线程
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论