打破具有无限循环的第三方goroutine

时间:2017-10-10 16:05:58

标签: go goroutine

我使用它来接收SNMP陷阱:https://github.com/soniah/gosnmp 现在,让我们说我想以编程方式突破(取自here):

  

错误:= tl.Listen(" 0.0.0.0:9162")

我最好的方法是什么?

我对Golang有些新鲜,并没有找到一种方法来摆脱我无法修改的goroutine("第三方")。

谢谢,

2 个答案:

答案 0 :(得分:5)

简短回答:你不能。没有办法从goroutine外部杀死goroutine(没有杀死整个程序)。

答案很长:goroutine可以听某种"终止"信号(通过通道,信号或任何其他机制)。但最终,goroutine必须从中终止

查看示例中的库,似乎未提供此功能。

答案 1 :(得分:1)

标准https://golang.org/pkg/net/#Conn界面提供了特殊方法SetDeadline(与SetReadDeadlineSetWriteDeadline一起),以便为已建立连接设置硬连接中断时间。正如我在source代码中看到的那样:

type GoSNMP struct {
    // Conn is net connection to use, typically established using GoSNMP.Connect()
    Conn net.Conn
     ...

    // Timeout is the timeout for the SNMP Query
    Timeout time.Duration
    ...

net.Conn界面已导出 - 因此您可以尝试直接访问该界面以设置截止日期。

type TrapListener struct {
    OnNewTrap func(s *SnmpPacket, u *net.UDPAddr)
    Params    *GoSNMP
    ...
}

依次导出TrapListener导出GoSNMP结构,以便您可以访问它。试试这个:

tl := TrapListener{...}
tl.Params.Conn.SetDeadline(time.Now().Add(1*time.Second))
tl.Listen(...)

然而this line让我感到不安 - 看起来它没有使用存储连接及其选项:

func (t *TrapListener) Listen(addr string) (err error) {
    ...
    conn, err := net.ListenUDP("udp", udpAddr)
    ....
}

但你可以尝试:)