Go 锁定文件以更新一部分数据或所有文件内容
我有一个可以从几个进程更新的文件,因此我想使用锁定和查找 这可能会有帮助 但我认为这个问题有点复杂,例如,要更新文件,api需要读取之前的文件/节(我们提供api,通过Go 锁定文件以更新一部分数据或所有文件内容,go,locking,race-condition,file-locking,Go,Locking,Race Condition,File Locking,我有一个可以从几个进程更新的文件,因此我想使用锁定和查找 这可能会有帮助 但我认为这个问题有点复杂,例如,要更新文件,api需要读取之前的文件/节(我们提供api,通过名称读取文件或应用程序对象) 获取json数据,在内存中修改它并更新文件 有两种选择: 更新所有文件内容 更新文件上的节,即一个 应用程序属性 问题如下: 1. Process A & Process B (can be more…) Reads the object of application name
名称读取文件或应用程序对象)
获取json数据,在内存中修改它并更新文件
有两种选择:
更新所有文件内容
更新文件上的节,即一个
应用程序属性
问题如下:
1. Process A & Process B (can be more…) Reads the object of
application name `node1`
2. Process A update the section (node1) with new data (for example
change the kind property and update)
3. Process B want to do the same , the problem is that between the time
it reads the data and the time it wants to update ,the data is not
valid since other process already update it.
此外,相同的场景对所有文件上下文都有效
比赛
条件问题
这是一个简短的文件示例,一些无状态进程可以在任何给定时间更新该文件
ID: demo
version: 0.0.1
applications:
- name: node1
kind: html5
path: node1
expose:
- name: node_api
properties:
url: ${app-url}
- name: node2
kind: nodejs
path: node2
parameters:
quota: 256M
memory: 256M
我们如何克服这个问题,或者简化它以避免竞争条件和共谋?可以有多种方法来解决这个问题
1) 使用锁
您可以创建读写锁。如果一个进程只想读取一个文件,它可以获得一个读锁。如果一个进程想要写,它会获得一个写锁,而其他进程必须等待写锁被释放
使用版本控制
您可以保留一个用于跟踪版本的计数器。
在写入文件的方法中仍然需要锁
初始版本1。
进程B读取文件,查看版本1。
进程A读取文件,查看版本1,然后写入,将版本增加到2,然后更新文件。
所以现在写之前的进程B将比较版本。由于其版本(版本1)小于当前版本(版本2),因此必须中止/重试其操作
仅当文件内容与其读取内容相同时,进程才应更新文件。您可以按照peterSO在回答中建议的方式实现它。我在评论中的建议仍然有效:您在中描述的用例通常由数据库实现。他们被设计来解决这个问题
但是,如果必须使用此YAML文件,则可以实现如下写入操作:
创建一个锁
通过读取文件进行更新
在内存中执行更改
写回文件
松开锁
这可确保不会更新过时的数据。这是一个常见问题,因此请寻找已知的解决方案。例如,乐观锁定
类似这样的伪代码:
lock file for read
read file into data1
release file lock
hash data1 as hash1
update data1
lock file for update
read file into data2
hash data2 as hash2
if hash1 != hash2
release file lock
return error
write file from (updated) data1
release file lock
return success
当一个进程读取一个文件时,它会一直更新它的内容吗?@AnkitDeshpande-不总是…听起来你真的想使用一个数据库。@flyx-很抱歉,在这种情况下我不能,我需要其他选项吗?甚至是简化事情的方法?或者限制API。。。我对想法持开放态度…当进程B尝试将数据写入文件并看到它已被进程A更新时,进程B应该做什么?读写锁不能防止过时数据。这个概念在这里并不真正适用,因为所有读取数据的进程都将数据复制到内存中的数据结构中。您可以为这些进程中的每一个进程创建一个读锁——在这种情况下,只要其他进程持有一个副本,您就不能写入数据(这听起来没有用)——或者您没有,在这种情况下,您没有解决问题。谢谢,1。散列数据应该保存在哪里?2.为什么我需要写入更新的数据#1
步骤,它总是在第5行完成?在第5行,内存中的数据会更新。在验证文件的哈希值未更改后,将其写入后面几行中的文件