你能让Golang在写入时丢弃数据包而不是阻塞吗?

huangapple go评论114阅读模式
英文:

Can you make Golang drop packets on writes rather than block?

问题

在Go语言中,可以通过使用带有缓冲区的通道来实现你描述的功能。当通道的缓冲区未满时,你可以向通道写入数据;当通道的缓冲区已满时,你可以选择丢弃该数据包并处理下一个数据包。

以下是一个示例代码,演示了如何在Go语言中实现这个功能:

package main

import "fmt"

func main() {
    // 创建一个长度为N的通道,其中N为你指定的长度
    N := 10
    ch := make(chan int, N)

    // 向通道写入数据,只有当通道未满时才会成功写入
    for i := 0; i < N+5; i++ {
        select {
        case ch <- i:
            fmt.Println("写入数据:", i)
        default:
            fmt.Println("通道已满,丢弃数据:", i)
        }
    }
}

在上面的示例中,我们创建了一个长度为N的通道,并使用make函数初始化它。然后,我们使用select语句来尝试向通道写入数据。如果通道未满,写入操作将成功,并打印出写入的数据;如果通道已满,写入操作将被默认分支捕获,并打印出丢弃的数据。

希望这可以帮助到你!如果你有任何其他问题,请随时提问。

英文:

Given a channel of length N, I want to write to it only if it is not full. Else I will drop this packet and process the next one.

Is this possible in GOlang

答案1

得分: 18

你可以使用select语句。示例代码如下:

package main

func main() {

	ch := make(chan int, 2)

	for i := 0; i < 10; i++ {
		select {
		case ch <- i:
			// 处理这个数据包
			println(i)
		default:
			println("满了")
			// 跳过这个数据包并继续
		}
	}
}

select语句用于在多个通信操作中选择一个可执行的操作。在示例代码中,通过select语句将i发送到通道ch中。如果通道已满,则会执行default分支,跳过当前数据包并继续循环。

英文:

You can use select. Example:

package main

func main() {

	ch := make(chan int, 2)

	for i := 0; i &lt; 10; i++ {
		select {
		case ch &lt;- i:
			// process this packet
			println(i)
		default:
			println(&quot;full&quot;)
			// skip the packet and continue
		}
	}
}

答案2

得分: 0

这是我写的辅助包中实现的OverflowingChannel类型,虽然有点晚了,但它正是使用了上面提到的select技巧。

  • 代码:https://github.com/eapache/channels
  • 文档:https://godoc.org/github.com/eapache/channels
英文:

A bit after the fact I know, but this is exactly what is implemented by the OverflowingChannel type in the helper package I wrote. It effectively uses the select trick above.

huangapple
  • 本文由 发表于 2013年10月3日 05:32:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/19147188.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定