实现两个golang轮询输出A1B2

发布时间:2024-07-05 11:13:50

在golang开发中,经常会遇到需要进行轮询输出字符的场景。在这篇文章中,我们将介绍如何使用golang实现一个简单的轮询输出A1B2的程序。

使用goroutine实现轮询输出

首先,我们需要使用goroutine来实现轮询输出。goroutine是golang中轻量级的线程,可以并发执行。我们可以使用goroutine来实现A1B2的轮询输出。下面是实现的代码:


package main

import (
	"fmt"
	"time"
)

func main() {
	go printA()
	printB()
}

func printA() {
	for i := 1; i <= 5; i++ {
		fmt.Println("A", i)
		time.Sleep(time.Second)
	}
}

func printB() {
	for i := 1; i <= 5; i++ {
		fmt.Println("B", i)
		time.Sleep(time.Second)
	}
}

使用channel实现同步

在上述代码中,我们使用goroutine实现了轮询输出A和B。但是这两个goroutine是并发执行的,可能会导致输出的字母和数字交错出现。为了保持A和数字的顺序输出,我们可以使用channel来实现同步。下面是修改后的代码:


package main

import (
	"fmt"
	"time"
)

func main() {
	c := make(chan int)

	go printA(c)
	printB(c)
}

func printA(c chan int) {
	for i := 1; i <= 5; i++ {
		fmt.Println("A", i)
		c <- i
		time.Sleep(time.Second)
	}
	close(c)
}

func printB(c chan int) {
	for i := range c {
		fmt.Println("B", i)
		time.Sleep(time.Second)
	}
}

使用select语句实现超时

在上面的代码中,我们通过使用channel实现了A和数字的顺序输出。但是如果printA的执行时间比printB长,那么printB将一直等待输入,程序会一直阻塞。为了解决这个问题,我们可以使用select语句来实现超时,即如果等待时间超过一定时间,就退出循环。下面是修改后的代码:


package main

import (
	"fmt"
	"time"
)

func main() {
	c := make(chan int)

	go printA(c)
	printB(c)
}

func printA(c chan int) {
	for i := 1; i <= 5; i++ {
		fmt.Println("A", i)
		c <- i
		time.Sleep(time.Second)
	}
	close(c)
}

func printB(c chan int) {
	timeout := time.After(3 * time.Second)
	for {
		select {
		case i, ok := <-c:
			if !ok { // channel已关闭
				return
			}
			fmt.Println("B", i)
			time.Sleep(time.Second)
		case <-timeout:
			return
		}
	}
}

通过以上的代码改进,我们实现了一个简单的轮询输出A1B2的程序。使用goroutine实现并发执行,使用channel实现同步,使用select语句实现超时。这种方式在实际开发中有很多应用场景,比如同时处理多个任务,通过channel来传递数据,使用select语句来处理超时等。希望本文对你理解golang的轮询输出有所帮助。

相关推荐