Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 锁定文件以更新一部分数据或所有文件内容_Go_Locking_Race Condition_File Locking - Fatal编程技术网

Go 锁定文件以更新一部分数据或所有文件内容

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

我有一个可以从几个进程更新的文件,因此我想使用锁定和查找 这可能会有帮助

但我认为这个问题有点复杂,例如,要更新文件,api需要读取之前的文件/节(我们提供api,通过
名称
读取
文件
应用程序
对象)
获取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行,内存中的数据会更新。在验证文件的哈希值未更改后,将其写入后面几行中的文件