并发处理
使用go语句
作用是帮我们启动一个新的例程出来
go 函数()
这个函数一旦开始执行,这个例程就启动了,一旦函数结束,这个例程就结束了
下面这种情况是同步的,只有一个主例程。test先执行完,才执行打印bbb
我们现在使用go 函数()
test函数启动了一个新的例程,和主例程分开去并行了。
现在是并发执行了(没有严格的谁块谁慢)
打印的结可能是aaa bbb也有可能是bbb aaa
aaa哪里去了?在Go语言的程序中,只要主例程结束了,这个程序就自动结束了,不会去管子例程有没有结束
我们现在修改一下代码,让主例程睡眠一下,等待子例程执行完
并发——没有严格的顺序
我们再举个例子:
每一次的结果都不一样,因为多例程是并行的,没有严格的先后顺序,我们无法预测,是系统分配
go 函数
1.参数允许
2.返回值不允许
不允许有返回值的(因为并发是没有严格的先后顺序的,有可能,fun1还没有完善,赋值就开始了,如果我们一定要接收返回值,需要用到channel)
允许有参数
线程间的同步
(生产者-消费者问题)
一个线程读,一个线程处理,要有严格的谁先谁后的顺序
我们通过对线程的阻塞进行线程间的同步(channel)!
死锁(deadlock)(互锁)
两个线程互相等待其占用的资源
解决方法:
1.重新设计程序逻辑——理论可行,实际不太靠谱
2.死锁检测——重启程序
(Go自带死锁检测,程序就会关闭,然后重启,再运行,死锁的问题就跨过去了)
99%