在 Go 中实现信号量的最佳方法是什么

我有一个测试程序,我想从命令行运行该程序的多个副本,我需要知道要启动的程序的第一个实例。在 Dart 中,我做了以下有人向我建议的操作:

RawServerSocket.bind("127.0.0.1", 8087)

如果失败,那么我知道另一个程序已经“锁定”了端口。这对我来说很好地解决了这个问题。当程序终止或显式关闭套接字时,锁被释放。

如何在 Go 中获得类似的结果?


慕村225694
浏览 168回答 3
3回答

慕盖茨4494581

你没有说你使用的是哪个平台。如果您想跨平台,那么打开本地套接字的解决方案非常简单。以下是您在 Go 中执行此操作的方法。package mainimport (    "log"    "net"    "time")func main() {    ln, err := net.Listen("tcp", "127.0.0.1:9876")    if err != nil {        log.Fatal("Failed to get lock: ", err)    }    defer ln.Close()    log.Print("Started")    time.Sleep(time.Second * 10)    log.Print("Ending")}不幸的是,在不使用套接字的情况下执行此操作的跨平台方法非常困难,并且会涉及两组代码,一组用于类 Unix 系统,另一组用于 Windows。请注意,病毒检查程序不喜欢在 Windows 上打开侦听套接字的程序...

桃花长相依

os.OpenFile()与os.CREATE | os.O_EXCL标志一起使用怎么样?file, err := os.OpenFile("lock", os.O_CREATE | os.O_EXCL | os.O_RDWR, 0400)if err != nil {        // Someone else has acquired the lock.}defer file.Close()defer os.Remove("lock") // Ignoring errors here!我没有编译或测试过这个,但它应该可以工作,无论如何,你明白了......
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go