版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangpengzp/article/details/88404722
多协程
go语言从语言层面高效的支持并发的,而协程相当于java里面的线程,但比线程要更小,可能十几个groutine(协程)可能体现在底层才5、6个程线。go语言内部实现了这些goriutine之间的内存共享。执行groutine所需栈内存极少(大概4、5kb),因此比Thread更高效、快捷。
go实现多协程,主要是调用go,然后接一个方法。如:
service 接受客户端的数据,并回复 :服务器收到了
package CSModle
import (
"fmt"
"net"
)
func StartService(){
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("err = " , err)
return
}
defer listener.Close()
// 接受多个用户
for{
conn, err2 := listener.Accept()
if err2 != nil{
fmt.Println("err2 = " , err2)
continue
}
// 开启一个线程
go readMassageFromClient(conn)
sendMessageToClient()
}
}
func readMassageFromClient(conn net.Conn) {
i := 0
for {
buf := make([]byte, 1024)
length, err3 := conn.Read(buf)
if err3 != nil {
fmt.Println("err3 =", err3)
return
}
i++
fmt.Println("buf = ", string(buf[:length]) , i)
if i%2 == 0 {
conn.Write([]byte("服务器收到了"))
}
}
defer conn.Close()
}
client:实时读取服务器数据,并且每隔2s发送一个数据:are you ok?
package main
import (
"fmt"
"net"
"time"
)
func SendMessageToService(conn net.Conn){
for{
time.Sleep(time.Duration(2) * time.Second)
conn.Write([]byte("are you ok ?"))
//defer conn.Close()
}
}
func readMassageFromService(conn net.Conn) {
for{
buf := make([]byte , 1024)
length, err3 := conn.Read(buf)
if err3 != nil {
fmt.Println("err3 =" , err3)
return
}
fmt.Println("buf = " , string(buf[:length]))
//defer conn.Close()
}
}
func main() {
conn,err := net.Dial("tcp", "127.0.0.1:8080")
if err != nil{
fmt.Println("err = " , err)
return
}
go readMassageFromService(conn)
SendMessageToService(conn)
// go readMassageFromService(conn)
}
node:调用go 启动子线程后,如果主线程执行完毕了,则子线程会自动关闭。因此,上述代码readMassageFromService(conn) 不能新建线程否则不能实现 实时读写服务端发送的数据。