go语言 多协程(线程)

多协程

go语言从语言层面高效的支持并发的,而协程相当于java里面的线程,但比线程要更小,可能十几个groutine(协程)可能体现在底层才5、6个程线。go语言内部实现了这些goriutine之间的内存共享。执行groutine所需栈内存极少(大概4、5kb),因此比Thread更高效、快捷。

go实现多协程,主要是调用go,然后接一个方法。如:

service 接受客户端的数据,并回复 :服务器收到了

package CSModleimport ("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 := 0for {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 mainimport ("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) 不能新建线程否则不能实现 实时读写服务端发送的数据。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部