刚看完go,对协程和通道的初步理解

之前看swoole文档 ,发现swoole的协程和通道很有意思,遍去学了下go语言,初步把go学完了,针对swoole的go function()谈谈我对这个协程的理解。

goroutine的个人理解

go语言中是通过go这个关键字去创建goroutine的,而swoole中也是一样的用go去 创建的,据了解,韩天峰大神就是借鉴了go的goroutine用了c/c++去实现的底层,接触过c的可能会知道,main函数是程序的入口,一般先执行main,他就会在栈区开辟一块空间,但调用go关键字的同时,他会在main的空间下再创建一个空间去运行,创建多go,就会有多少个空间创建,他们会并发的运行,(反正底层也是程序的线程操作的,什么各种加锁等)

package main

import (
	"fmt"
	"strconv"
)

func main() {
	for i := 0; i < 10; i++ {
		go hello_word(i, i)
	}
}
func hello_word(x, y int) {
	z := x + y
	fmt.Println("hello word" + strconv.Itoa(z))
}


上面代码创建了10个斜程,并把他们的数打印出来,然而运行结果是:

刚看完go,对协程和通道的初步理解_第1张图片
什么都没有输出,证明确实这些函数都是并行的,main函数也不会去等待他们执行,所以这个时候通道就来了

func main() {
	c := make(chan int)
	for i := 0; i < 10; i++ {
		go hello_word(i, i, c)
		num := <-c
		fmt.Println("hello word" + strconv.Itoa(num))
	}

}
func hello_word(x, y int, c chan int) {
	z := x + y
	c <- z
}

刚看完go,对协程和通道的初步理解_第2张图片
这样就可以通过通道等待并把数据打印下来 。如果不要等待的话,就需要close()这个函数关闭通道,然后再去遍历通道把数据一一取出,由于懒,也不想做跑代码记录了。对于斜程和通道大概就是这么理解的。swoole基本 也是这样的过程,也是最近刚开始接触,共同学习,大神轻喷。

你可能感兴趣的:(php)