日志系统并发写问题 竞争关系

无锁方案就是 lock-free

  • 一般多个线程写文件 三步
    • open
    • seek
    • write

linux io 两个原子操作

  • open o_create
  • write o_appned

java 测试

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.concurrent.CountDownLatch;

public class Main {
    public static void main(String[] args) throws IOException, InterruptedException {
        CountDownLatch latch = new CountDownLatch(1000);
        FileWriter writer = new FileWriter("file.log", true);
        for (int i = 0; i < 1000; i++) {
            new Thread(() -> {
                try {
                    writer.write("Hello, world!\n");
                    writer.flush();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                latch.countDown();

            }).start();
        }
        latch.await();
    }
}

golang 测试

package main

import (
	"fmt"
	"log"
	"os"
	"sync"
)

func main() {
	f, err := os.OpenFile("file.log",
		os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		log.Println(err)
	}
	fmt.Println("File created....")
	var wg sync.WaitGroup
	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func(wg *sync.WaitGroup) {
			if _, err := f.WriteString("Hello, world!\n"); err != nil {
				log.Println(err)
			}
			wg.Done()
		}(&wg)
	}

	wg.Wait()
}

python 测试

import multiprocessing


def func():
    f = open("file.log", 'a')
    f.write('hello world !\n')


if __name__ == '__main__':

    pool = multiprocessing.Pool(100)
    for i in range(100):
        pool.apply_async(func)

    pool.close()
    pool.join()

posted @ 2022-11-18 09:41  vx_guanchaoguo0  阅读(18)  评论(0编辑  收藏  举报