• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Go语言 - 并发编程

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Go语言使用go关键词实现goroutine并发,可以通过channel传输数据。

go关键词修饰函数实现goroutine并发:

func main_go() {
	// runtime.GOMAXPROCS(最大256)
	fmt.Println(runtime.NumCPU()) // 16
	runtime.GOMAXPROCS(8)         // 8核16线程,默认就是runtime.NumCPU()
	var w sync.WaitGroup          // 跟java的countdown差不多
	w.Add(10)
	for i := 0; i < 10; i++ {
		// w.Add(1)
		// 使用go,相当于new Thread().start() . 栈:2K
		go func(i int) {
			defer w.Done()
			fmt.Printf("goooooo:::%d\n", i)
		}(i)
	}

	fmt.Println("demo2")
	w.Wait()
	// time.Sleep(time.Second)
	// `GMP` m:n 把m个G交给n个操作系统线程执行
}

channel变量实现数据交换:

func main_channel() {
	// channel FIFO
	// var a []int
	// var b chan int
	var w sync.WaitGroup
	w.Add(1)

	var c = make(chan int /*, 1*/) // 初始化通道,通道必须初始化才能使用
	go func() {
		x := <-c
		// <- c // 可以直接忽略
		fmt.Printf("x=%d\n", x)
		w.Done()
	}()
	c <- 10
	fmt.Println(c)
	// 关闭通道
	close(c)
	w.Wait()
	// <- 不管是发送还是接受,都使用这个符号
	// 发送:c <- 1
	// 接受:x := <- c
	// 关闭close()

	// 单向通道
	var get_channel <-chan int // 只能取
	var put_channel chan<- int // 只能存
	get_channel = make(<-chan int)
	put_channel = make(chan<- int)
	fmt.Println(get_channel, put_channel)
}

使用select实现多路复用:

func main_select() {
	ch := make(chan int, 2)
	for i := 0; i < 10; i++ {
		select {
		case x := <-ch:
			fmt.Println(x)
		case ch <- i:
		}
	}
}

互斥锁:

func main_lock() {
	var w sync.WaitGroup
	w.Add(2)
	// 互斥锁
	var lock sync.Mutex
	var x = 0
	incr := func() {
		for i := 0; i < 50000; i++ {
			lock.Lock()
			x += 1
			lock.Unlock()
		}
		w.Done()
	}
	go incr()
	go incr()
	w.Wait()
	fmt.Printf("x=%d\n", x)
}

读写锁:

func main_rwlock() {
	var w sync.WaitGroup
	w.Add(600)
	// 读写锁
	var lock sync.RWMutex
	var x = 0
	read := func() {
		lock.RLock() // reading lock
		fmt.Printf("x=%d\n", x)
		time.Sleep(time.Millisecond)
		w.Done()
		lock.RUnlock() // reading unlock
	}
	write := func() {
		lock.Lock() // writing lock
		x += 1
		time.Sleep(25 * time.Millisecond)
		w.Done()
		lock.Unlock() // writing unlock
	}
	for i := 0; i < 100; i++ {
		go write()
	}
	time.Sleep(50 * time.Millisecond)
	for i := 0; i < 500; i++ {
		go read()
	}
	w.Wait()
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
GO- 使用JSON发布时间:2022-07-10
下一篇:
go 语言的web 框架发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap