日志系统并发写问题 竞争关系
无锁方案就是 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()
本文来自博客园,作者:vx_guanchaoguo0,转载请注明原文链接:https://www.cnblogs.com/guanchaoguo/p/16902177.html