热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在Golang中读取和写入文件concurent?

如何解决《如何在Golang中读取和写入文件concurent?》经验,为你挑选了1个好方法。

我设置了一个网络服务器,我使用自己的包,在那里我做了一些写/读文件.当服务器获得tcp连接时,我启动一个不同的goroutine来处理每个连接的请求.在请求处理程序func中,我调用了func DoSomething()some_package.

这是web_server.go的代码:

 package main
 import (
    sp "./some_package"
    "log"
    "net"
    "os"
    "net/http"
   )

func main() {

  l, err := net.Listen("tcp", "0.0.0.0" + ":" + "4567")
  if err != nil {
    log.Println("Error listening:", err.Error())
    os.Exit(1)
  }
  defer l.Close()
  log.Println("Listening on 0.0.0.0:4567")  
  go func() {
    for {
        // Listen for an incoming connection.
        conn, err := l.Accept()
        if err != nil {
            log.Println("Error accepting: ", err.Error())
            os.Exit(1)
        }
        // Handle connections in a new goroutine.
        go handlerFunction(conn)
    }
  }()

  log.Printf("Setting up the Webserver...")
  err = http.ListenAndServe("0.0.0.0:"+"4568", nil)
  if err != nil {
    log.Fatal(err)
  }
}

func handlerFunction(conn net.Conn) {
  defer conn.Close()
  sp.DoSomething()
}

该函数DoSomething()读写文件.您可以在包中看到声明它的代码:

package some_package
import (    
    "io/ioutil"
    "strconv"
    "os"
    "log"
   )
func IncrementValue(pastValue string)(newValue string){
  newValueInt, _ := strconv.Atoi(pastValue)
  return strconv.Itoa(newValueInt + 1)
}

func DoSomething() (err error){
  initialValue := "1"
  filename := "myFile.txt"
  if _, err := os.Stat(filename); err == nil {
    someText, err := ioutil.ReadFile(filename)
    if err != nil {
        log.Printf("Error reading")
        return err
    }
    newValue := IncrementValue(string(someText))

    err = ioutil.WriteFile(filename,[]byte(newValue), 0644)
    if err != nil { 
        return err
    }
  }else{
    err = ioutil.WriteFile(filename,[]byte(initialValue), 0644)
    if err != nil { 
        return err
    }
  }
  return
 }

我如何使用类似的锁定机制mutex.Lock,mutex.Unlock在这种情况下,使文件读取和写入并发,这样当一个当前正在编写的例程可以阻止另一个例程读取,直到第一个例程成功写入文件?

在阅读或写入文件时,我的示例是否适合并发?

这是正确的方法吗?谢谢



1> JimB..:

您不能同时读取和写入文件(嗯,这是可能的,但不是您所描述的访问模式).使用单个互斥锁序列化对文件的所有访问权限:

var fileMutex sync.Mutex

func DoSomething() {
    fileMutex.Lock()
    defer fileMutex.Unlock()

    //...
}


推荐阅读
author-avatar
帝薩克斯_271
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有