我的程序中有多个goroutine,每个都在fmt.Println没有任何显式同步的情况下进行调用.这是安全的(即,每条线路是否单独出现而没有数据损坏),或者我是否需要创建另一个带有同步的goroutine来专门处理打印?
我知道我们可以使用log和打印变量或错误fmt.例如,如果我想打印变量,我可以这样做:
h := "world"
fmt.Printf("hello = %v\n", h)
log.Printf("halo = %v\n", h)
Run Code Online (Sandbox Code Playgroud)
输出将是:
hello = world
2016/12/30 09:13:12 halo = world
Run Code Online (Sandbox Code Playgroud)
并且通常在错误处理中我发现这样的日志
if err != nil {
log.Println("Error : something terrible happen -> ", err)
return err
}
Run Code Online (Sandbox Code Playgroud)
但从上面的情况我也可以fmt用来打印这样的错误
fmt.Printf("Error : something terrible happen -> %v\n",err.Error())
Run Code Online (Sandbox Code Playgroud)
使用fmt而不是log打印错误是一个好习惯吗?然后我总是使用fmt而不是log在调试时打印变量.
我正在设计一个将时间序列数据写入文件的系统.数据是8个字节的块,分为两个4字节部分,时间和有效负载.
根据MSDN,WriteFile函数是原子的(http://msdn.microsoft.com/en-us/library/aa365747(VS.85).aspx),如果写入的数据小于扇区的大小.
由于文件只包含这些块(文件没有"结构",因此无法重建损坏的文件),一个接一个地添加,因此整个块或者没有任何内容写入文件是至关重要的.一直.
所以问题是,我是否正确地理解了,无论在实际调用writefile期间发生了什么,一个小于扇区的写文件总是完全写入磁盘或根本不写入?
我刚刚发现将字节写入文件对于 Go 来说很慢。
我想创建一个 10mb 的文件。Go 需要将近 1 分钟才能完成,但在 C 中不到 5 秒。
这是 Go 代码:
package main
import (
"fmt"
"os"
)
func main() {
f, _ := os.Create("./src/test/test.txt")
count := int(1.024e7)
for i := 0; i < count; i++ {
f.Write([]byte{byte('a' + i%24)})
}
f.Close()
fmt.Println("ok")
}
Run Code Online (Sandbox Code Playgroud)
和 C:
#include <stdio.h>
int main()
{
FILE *fp=fopen("data.txt","w");
int size=1.024e7;
for(int i=0;i<size;i++)
putc('a'+i%24,fp);
fclose(fp);
printf("ok");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 当两个 Goroutine 同时写入文件时,线程安全吗os.File.Write()?
根据这个问题Is os.File's Write() threadsafe? ,它不是线程安全的。./test.txt然而,以下代码的输出文件并没有出现错误。
根据这个问题,多个进程同时写入同一个文件是否安全?[CentOs 6, ext4],POSIX“原始”IO 系统调用是线程安全的。os.File.Write()使用 POSIX IO 系统调用,那么我们可以说它是线程安全的吗?
package main
import (
"fmt"
"os"
"sync"
)
func main() {
filePath := "./test.txt"
var wg sync.WaitGroup
wg.Add(2)
worker := func(name string) {
// file, _ := os.Create(filePath)
file, _ := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE, 0666)
defer file.Close()
defer wg.Done()
for i := 0; i < 100000; i++ {
if _, err := file.Write([]byte(name + ": is os.File.Write() …Run Code Online (Sandbox Code Playgroud)