第二十二篇:go协程练习:互斥锁入门、io、bufio读写文件
一:先看实例
1.1:单线程执行

1.2:开启两个协程


二:互斥锁入门
上节课我们学到了sync包,利用其waitgroup来实现等待协程执行结束
sync包里还有一个很有用的功能:锁
今天我们先学 sync.Mutex ,互斥锁,其中有两个函数
1、Lock() 上锁
2、Unlock() 解锁
一旦上锁后,其他协程来操作 则必须等待Unlock(过程是阻塞的),这样就能防止竞争资源导致的数据不准确
接下来我们更改代码


互斥锁的使用保证了我们协程的数据的安全性,但是性能会有所降低,下一篇我们来介绍读写锁,来提高我们的性能;
三:读写分离
这里我们需要快速了解几个包
1、OS包,标准包之一
用它可以来获取文件、目录、进程等
譬如
os.Getwd() //当前目录
os.Getpid() //获取当前进程ID
os.Getenv("PATH")) //获取环境变量
os.Create //创建文件
os.Mkdir //创建目录
os.Open //打开文件,获取文件指针
读取文件:
file,_:=os.Open("./test/news")
其中go里面有两个接口
1、io.Reader
2、io.Writer
它们是IO操作的两个高度抽象接口
实现Reader/Writer的常用结构有
1、net.Conn, os.Stdin,os.Stdout, os.File: 网络、标准输入输出、文件
2、strings/bytes.Reader: 把字符串/byte[] 抽象成Reader
3、bytes.Buffer: 把[]byte抽象成Reader和Writer
5、bufio.Reader/Writer: 抽象成带缓冲的流读取(比如按行读写)
O_RDONLY int = syscall.O_RDONLY // 读模式.
O_WRONLY int = syscall.O_WRONLY // 写模式
O_RDWR int = syscall.O_RDWR // 读写
O_APPEND int = syscall.O_APPEND // 在文件末尾追加,打开后cursor在文件结尾位置
O_CREATE int = syscall.O_CREAT // 如果不存在则创建
O_EXCL int = syscall.O_EXCL //与O_CREATE一起用,构成一个新建文件的功能,它要求文件必须不存在
O_SYNC int = syscall.O_SYNC // 同步方式打开,内容直接写入硬盘
O_TRUNC int = syscall.O_TRUNC // 打开并清空文件
例1:

例2:

例3:

四:bufio了解下

每隔3秒写入,我们可以不断打开文件测试,可以看到,每次write都是直接写入文件的。
因此,频繁的对磁盘读写会造成不必要的性能开支和对磁盘的影响。
于是bufio出现了,它自带缓冲区,当缓冲到达一定量后才进行下一步操作(如写文件)


浙公网安备 33010602011771号