合肥高端网站建设公司哪家好?如何报考软件工程师证书?
摘要:合肥高端网站建设公司哪家好,软件工程师证书报考网站,做电力 公司网站,seo经典案例分析goruntine(协程) 每一个并发的执行单元叫做一个goruntine,要编写一个并发任务&#xff0
合肥高端网站建设公司哪家好,软件工程师证书报考网站,做电力 公司网站,seo经典案例分析goruntine(协程)
每一个并发的执行单元叫做一个goruntine#xff0c;要编写一个并发任务#xff0c;可以在函数名前加go关键字#xff0c;就能使这个函数以协程的方式运行#xff0c;
如#xff1a;go 函数名#xff08;函数参数#xff09;、
如果函数有返回值…goruntine(协程)
每一个并发的执行单元叫做一个goruntine要编写一个并发任务可以在函数名前加go关键字就能使这个函数以协程的方式运行
如go 函数名函数参数、
如果函数有返回值返回值会被忽略。所以当你用go关键字后主进程调用函数的时候函数的返回值就没有和主进程进行数据交换而只能用channel 线程和协程的区别
区别1线程有固定的栈基本都是2MB都是固定分配的这个栈用于保存局部变量在函数切换时使用。对于协程来说固定的栈可能会导致资源浪费go采用了动态收缩扩张收缩的策略初始化为2KB最大可扩张到1GB
区别2线程切换要陷入内核进行上下文切换而协程在用户态由协程调度器完成不用陷入内核
demo:协程的基本使用
package mainimport (fmttime
)func Task1() {for {fmt.Println(time.Now().Format(10:48:00), 正在处理task1的任务)time.Sleep(time.Second * 3)}
}func Task2() {for {fmt.Println(time.Now().Format(10:48:00), 正在处理task2的任务)time.Sleep(time.Second * 1)}}func main() {go Task1()go Task2()for {fmt.Println(time.Now().Format(10:48:00), 正在处理主进程的任务)time.Sleep(time.Second * 2)}
}
demo2
package mainimport (fmttime
)/*
当一个程序启动时其主函数即在一个单独的goroutine中运行我们称之为main goroutine。下面这个程序运行后不会有任何输出因为运行go task1(),程序立刻返回到main函数main函数后没有任何代码逻辑程序判断为执行完毕终止所有协程。
如果要让task1函数执行可以在main函数加上一些等待逻辑确定子协程执行完毕后结束main函数。如sleep()
*/func task1() {for {fmt.Println(time.Now().Format(10:48:00), 正在处理task1的任务)time.Sleep(time.Second * 3)}
}func main() {go task1()time.Sleep(time.Second * 100)
}
demo3: 使用匿名函数创建goruntine
package mainimport (fmttime
)/*
使用匿名函数创建goruntine,格式如下
go func(参数列表{函数体
}(调用参数列表*/func main() {go func() {for {fmt.Println(time.Now().Format(11:17:00), 正在处理task1的任务)time.Sleep(time.Second * 3)}}()time.Sleep(time.Second * 100)
}
channel
go中推荐使用channel作为goruntine之间同步和通信的手段
常见写法var channelName chan T
含义用chan关键字声明了一个channel变量并指定了传输的数据类型T channel的发送和接收channel作为一个队列收发数据时按先入先出的原则同一时刻内只能允许一个goruntine访问channel来发送和接受数据
发送channel-val
含义表示将var发送到channel中如果channel中数据被填满之后会阻塞当前goruntine 接受val-channel
含义表示从channel中读取数据赋值给var上如果channel中没有数据会阻塞读取的goruntine直到有数据被放到channel中。
注可以在读取channel时立刻返回如 var,ok:-channel 此时检查ok是否为true用来判断是否读到了有效数据。 初始化ch:make(chan T,sizeofChan)
注
在创建channel时要指定channel传输的数据类型长度是可选的。
