作者:帝薩克斯_271 | 来源:互联网 | 2023-05-19 14:09
我设置了一个网络服务器,我使用自己的包,在那里我做了一些写/读文件.当服务器获得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()
//...
}