为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕村225694 2021-06-18 02:27:01
我有一个测试程序,我想从命令行运行该程序的多个副本,我需要知道要启动的程序的第一个实例。在 Dart 中,我做了以下有人向我建议的操作:RawServerSocket.bind("127.0.0.1", 8087)如果失败,那么我知道另一个程序已经“锁定”了端口。这对我来说很好地解决了这个问题。当程序终止或显式关闭套接字时,锁被释放。如何在 Go 中获得类似的结果?
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

你没有说你使用的是哪个平台。如果您想跨平台,那么打开本地套接字的解决方案非常简单。以下是您在 Go 中执行此操作的方法。


package main


import (

    "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 上打开侦听套接字的程序...


查看完整回答
反对 回复 2021-06-28
?
桃花长相依

TA贡献1860条经验 获得超8个赞

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!

我没有编译或测试过这个,但它应该可以工作,无论如何,你明白了......


查看完整回答
反对 回复 2021-06-28
  • 3 回答
  • 0 关注
  • 167 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信