第二十二篇:go协程练习:互斥锁入门、io、bufio读写文件

:先看实例

1.1:单线程执行

 

 

 1.2:开启两个协程

 

 

 

 

 

 

:互斥锁入门

上节课我们学到了sync包,利用其waitgroup来实现等待协程执行结束

sync包里还有一个很有用的功能:锁

今天我们先学 sync.Mutex ,互斥锁,其中有两个函数

1Lock() 上锁

2Unlock() 解锁

一旦上锁后,其他协程来操作 则必须等待Unlock(过程是阻塞的),这样就能防止竞争资源导致的数据不准确

 

接下来我们更改代码

 

 

 

 

 互斥锁的使用保证了我们协程的数据的安全性,但是性能会有所降低,下一篇我们来介绍读写锁,来提高我们的性能;

:读写分离

这里我们需要快速了解几个包

1OS包,标准包之一

  用它可以来获取文件、目录、进程等

  譬如

os.Getwd() //当前目录

os.Getpid() //获取当前进程ID

os.Getenv("PATH")) //获取环境变量

os.Create //创建文件

os.Mkdir //创建目录

os.Open //打开文件,获取文件指针

读取文件:

 file,_:=os.Open("./test/news")

  其中go里面有两个接口

   1io.Reader

   2io.Writer

它们是IO操作的两个高度抽象接口

 

 实现Reader/Writer的常用结构有

1net.Conn, os.Stdin,os.Stdout, os.File: 网络、标准输入输出、文件

2strings/bytes.Reader: 把字符串/byte[] 抽象成Reader

3bytes.Buffer: []byte抽象成ReaderWriter

5bufio.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出现了,它自带缓冲区,当缓冲到达一定量后才进行下一步操作(如写文件)

 

posted @ 2020-06-11 17:48  痞子胥  阅读(572)  评论(0)    收藏  举报