python - 如果并发读/写访问会发生什么?
问题描述
在zarr 教程中是这样写的:
Zarr 阵列并不是为多个读取器和写入器同时在同一个阵列上操作的情况而设计的。
如果真的发生了会发生什么?它会崩溃吗?未定义的行为?它会只是缓慢或低效吗?
编辑:支持多个作者和多个读者:
数据源是指可能发生多个并发读取操作。数据接收器是指可能发生多个并发写入操作,每个写入器更新数组的不同区域
例子:
synchronizer = zarr.ProcessSynchronizer('data/example.sync')
z = zarr.open_array(..., synchronizer=synchronizer)
解决方案
根据他们自己的文档,默认行为是不同步。
因此,它不会很慢/效率低 - 如果您确实有同步并且工作人员必须等待其他工作人员在继续之前释放资源,就会发生这种情况。
它也不会崩溃,至少在没有第三方干预的情况下 - 没有什么限制访问,我推断没有针对这种情况的运行时检查可能会引发设计错误。
不明确的?不完全是,但我们越来越近了。假设默认情况下确实没有检查或锁定,您将得到一个竞争条件,即如果您的 Writer 首先获取您的数据,则尝试读取它的 Reader 将简单地看到 Writer 写的任何内容。
相反,如果您的 Reader 首先获得其肮脏的小 IO,它将在被 Writer 覆盖之前读取原始数据。如果你有两个 Writer,以后出现的那个将决定数据的最终形状。
> 2个读者/作家也是如此;我把弄清楚由此产生的混乱的细节作为练习留给你。
推荐阅读
- excel - VBA OR IF 语句
- java - 为什么我看到这个 Springboot starter 2.1.2 pom 不可解析问题?
- javascript - ENOENT 没有这样的文件或目录 - 来自命令行但不是来自 VS Code 终端
- ios - 如何转换数组`UnsafePointer
` 到浮点数数组? - c# - 仅显示可被 5 整除的分钟数
- ios - iPhone 应用程序在更新后以 iPhone 4 大小运行,带有黑条
- selenium - Geb、Spock、Gradle 和 maxParallelForks
- python - 如何将 python 根设置为 Dockerfile 工作目录
- python - 访问 runtest 挂钩内的 pytest PluginManager 对象
- java - 在java中将对象添加到动态列表中