相关疑难解决方法(0)

一个以上的goroutine打印到stdout是否安全?

我的程序中有多个goroutine,每个都在fmt.Println没有任何显式同步的情况下进行调用.这是安全的(即,每条线路是否单独出现而没有数据损坏),或者我是否需要创建另一个带有同步的goroutine来专门处理打印?

concurrency synchronization go goroutine

22
推荐指数
3
解决办法
7238
查看次数

何时使用log over fmt进行调试和打印错误?

我知道我们可以使用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在调试时打印变量.

go

17
推荐指数
3
解决办法
1万
查看次数

WriteFile是原子的吗?

我正在设计一个将时间序列数据写入文件的系统.数据是8个字节的块,分为两个4字节部分,时间和有效负载.

根据MSDN,WriteFile函数是原子的(http://msdn.microsoft.com/en-us/library/aa365747(VS.85).aspx),如果写入的数据小于扇区的大小.

由于文件只包含这些块(文件没有"结构",因此无法重建损坏的文件),一个接一个地添加,因此整个块或者没有任何内容写入文件是至关重要的.一直.

所以问题是,我是否正确地理解了,无论在实际调用writefile期间发生了什么,一个小于扇区的写文件总是完全写入磁盘或根本不写入?

ntfs writefile visual-c++

6
推荐指数
1
解决办法
1427
查看次数

与 C 相比,为什么 Go 将字节写入文件的速度很慢

我刚刚发现将字节写入文件对于 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)

c go

2
推荐指数
1
解决办法
118
查看次数

golang 中 os.File.Write() 线程安全吗?

当两个 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)

linux multithreading posix go

2
推荐指数
2
解决办法
5064
查看次数