go 并发

1、runtime
	runtime.Gosched() 让出时间片,重新等待分配

func run (){
	go func(){
		fmt.Print(11)
}()
	
	
	go func(){
	time.sellp(time.Second)
}() 
	#主函数这个协程让出时间片
	runtime.Gosched()
	fmt.Print(12)
}
runtime.Goexit()  退出当前协程
func main(){
	go func(){
	fmt.Print("协程啊")
	runtime.Goexit() //退出这个协程了啊 
	fmt.Print("这里会执行吗???")  //不会的

}

	runtime.Gosched()//不让出时间片,另一个协程都不会执行,因为main主协程挂了,子协程也会挂

}
runtime.GOMAXPROCS()   设置当前程序并发时占用的CPU逻辑核心数 ,Go1.5版本之前,默认使用的是单核心执行。Go1.5版本之后,默认使用全部的CPU逻辑核心数。
package main
import ("runtime"
		"fmt")


func a(){
	fmt.Println("a协程")
}


func b(){
	fmt.Println("b协程")
}


func main(){
	runtime.GOMAXPROCS(1)// 设置并发时处理核数为1,此时为并发
	runtime.GOMAXPROCS(2)// 设置并发时处理核数为2,此时为并行
	go a()
	go b()
}

channel 管道 (三种操作:发送、接收、关闭)
虽然可以使用共享内存进行数据交换,但是共享内存在不同的goroutine中容易发生竞态问题。为了保证数据交换的正确性,必须使用互斥量对内存进行加锁,这种做法势必造成性能问题


Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也就是声明channel的时候需要为其指定元素类型。
接收和发送 都是用     <- 
关闭通道    close()   如果通道不用发送和接收 要记得关闭通道

1、无缓冲通道 (阻塞通道),必须要发送和接收,不然会panic

只发送,没接收,会死锁


	func main(){
		c:=make(chan int)
		c<-1
}
// 报错信息:fatal error: all goroutines are asleep - deadlock! 

/只接收,不发送,会死锁

	func main(){
	c1:=make(chan int)
	<-c1
}

//fatal error: all goroutines are asleep - deadlock!

同时发送和接收

func main(){
	c2:=make(chan int )
	go func( c2 chan int){

			c2<-11
		}(c2)

	ccc:=<-c2
	close(ccc) 
	fmt.Println(ccc)
	}



2、有缓冲通道

创建一个有缓冲的通道
	func main(){
		c:=make(chan int, 3)  //能缓冲三个
		c<-1
		fmt.Println(c)
		l:=len(c) //管道的长度
		p:=cap(c)///
}

3、单向通道

func channel(aa chan<- int ,bb <-chan int ){
	for i:=0 ;i<100 ;i++{
	aa<-i
}
	close(aa)
	<-bb
}

func main(){
	a1:=make(chan int 100)
	b1:= make(chan int )
	channel(a1,b1)
	//aa 是一个只可发送的通道
	// bb 是一个只可接收的通道
}

你可能感兴趣的:(go 并发)