当前位置: 首页 > 面试题库 >

如何中断执行(* TCPListener)接受的goroutine?

吉毅
2023-03-14
问题内容

我最近在玩go,尝试制作一些服务器来响应tcp连接上的客户端。

我的问题是我该如何干净地关闭服务器并中断在以下调用中当前“被阻止”的go例程

func(* TCPListener)接受吗?

根据接受文件

Accept在侦听器接口中实现Accept方法;它等待下一个调用并返回通用Conn。

错误也很少被记录下来。


问题答案:

这是我一直在寻找的东西。也许将来会帮助某人。注意使用select和“ c”通道将其与退出通道结合使用

    ln, err := net.Listen("tcp", ":8080")
    if err != nil {
        // handle error
    }
    defer ln.Close()
    for {
        type accepted struct {
            conn net.Conn
            err  error
        }
        c := make(chan accepted, 1)
        go func() {
            conn, err := ln.Accept()
            c <- accepted{conn, err}
        }()
        select {
        case a := <-c:
            if a.err != nil {
                // handle error
                continue
            }
            go handleConnection(a.conn)
        case e := <-ev:
            // handle event
            return
        }
    }


 类似资料:
  • 问题内容: 我知道设计不能通过中断来控制其执行,但是我想其中有些人可能会遇到此问题。s是组成异步执行的一种非常好的方法,但是考虑到当您希望取消future时中断或停止基础执行时,我们该怎么做?还是我们必须接受,任何取消或手动完成的操作都不会影响正在执行该操作的线程? 我认为,那显然是一项无用的工作,需要花费执行者的时间。我想知道在这种情况下哪种方法或设计可能会有所帮助? 更新 这是一个简单的测试

  • 我知道设计无法通过中断来控制其执行,但我想你们中的一些人可能有这个问题。s是组成异步执行的非常好的方法,但考虑到当未来被取消时您希望底层执行被中断或停止的情况,我们如何做到这一点?或者我们必须接受任何取消或手动完成的都不会影响在那里工作以完成它的线程? 在我看来,这显然是一项无用的工作,需要执行者的时间。我想知道在这种情况下,什么方法或设计可能会有所帮助? 更新 这是一个简单的测试

  • 你好,我想问一下使用这个有什么不同: 谢谢你的回答

  • 我不确定如何获得SQL执行所影响的行数。 我确实喜欢这样: 返回: (1)SQL数据操作语言(DML)语句的行计数,或(2)0表示不返回任何内容的SQL语句 啊! 我希望是: 从中提取第一个单词。字以空格或EOL行字符结束。 如果该单词(忽略大小写)是INSERT、UPDATE或DELETE,那么它是一个DML语句,并且的输出是相关的,否则的输出是无关的。 丑陋和容易出错。但这个问题唯一可能的解决

  • 输入 输出应该是这样的:

  • 下面是TestNG框架中的一个示例断言方法。 下面是fail方法。 在TestNG中是否有一个内置的方法来执行软断言。如果没有,实现这一点的理想方式是什么。