go语言 多协程(线程)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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) 不能新建线程否则不能实现 实时读写服务端发送的数据。

猜你喜欢

转载自blog.csdn.net/zhangpengzp/article/details/88404722