【问题标题】:Concurrent file accesses from different scripts python来自不同脚本python的并发文件访问
【发布时间】:2018-01-09 09:43:47
【问题描述】:

我有几个脚本。他们每个人都进行一些计算,并且完全独立于其他人。一旦这些计算完成,它们将被保存到磁盘并更新记录。

记录由一个类的实例维护,该实例将自身保存到磁盘中。我想在多个脚本中使用一个记录实例(例如,record_manager = RecordManager(file_on_disk)。然后是record_manager.update(...));但我现在不能这样做,因为在更新记录时,可能会同时对磁盘上的同一个文件进行写访问,从而导致数据丢失。所以我对每个脚本都有一个单独的记录管理器,然后我以后手动合并记录。

在解决并发写入访问问题的所有脚本中使用单个实例的最简单方法是什么?

我使用的是 macOS (High sierra) 和 linux (Ubuntu 16.04)。

谢谢!

【问题讨论】:

  • 您是否考虑过在所有脚本中只运行对象的一个​​实例并使用进程通信来告诉它要写什么?
  • 我很确定这个问题的答案可能取决于你的操作系统,所以请提供
  • 拥有多个日志或任何您想调用它们的名称并在它们全部完成后合并它们是很常见的。如果他们是独立的,为什么还要麻烦呢?
  • @AntiMatterDynamite 你能详细说明一下吗?什么意思?
  • @majorcoder Linux 和 MacOS。我已经更新了问题

标签: python file concurrency


【解决方案1】:

要为此构建自定义解决方案,您可能需要编写一个简短的新排队模块。此排队模块将单独拥有对文件的写访问权,并从代码中的现有模块传递写操作。

队列逻辑和逻辑应该是一个非常简单的队列架构。

python 中可能还存在一些库来处理此问题,从而避免您编写自己的队列类。

最后,整个事情可能会/可以由您的操作系统以某种方式处理,而不依赖于 python。

【讨论】:

  • 感谢您的回答!所以这个排队模块需要作为一个单独的进程运行,我的所有脚本都与之交互,对吧?如果这是唯一的选择,我想我可以尝试这样做,但如果可能的话,我想避免增加复杂性
  • 这里是一个类似自定义模块的示例:stackoverflow.com/questions/6524635/… 我理解避免这种复杂性的愿望,必须有一个库/内置支持来处理这个问题,因为这似乎是一个常见问题。
  • 谢谢,这似乎是一个不错的解决方案。不过,您如何看待文件上的简单锁定?
  • 我不确定,但我认为您的 Mac OS 会在默认情况下对正在写入的文件施加锁定。这意味着在第一次写入时尝试的任何第二次写入都将被拒绝并且永远不会实现,因为它不是队列,它是一个简单的锁。这可能是错误的,但我相信我之前读过有关 Mac OS 的内容。
  • 是的!也许您可以在 save 命令的 while 循环中添加一个简短的 sleep 命令,以检查文件是否被锁定/正在编辑,以及它是否只是具有 save sleep 线程并在半秒后再次检查,依此类推
猜你喜欢
  • 1970-01-01
  • 2014-01-04
  • 2014-01-11
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2014-07-03
  • 1970-01-01
  • 2014-06-09
相关资源
最近更新 更多