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

如何检测占用锁的goroutine?

如何检测占用锁的goroutine?

Go
慕田峪4524236 2023-07-31 14:59:09
我制作了一个 HTTP 服务器,并Echo存储数据使用storm和数据模型,如下所示:项目1(桶) device_type_1(桶)  设备_1(kv)  设备_2(kv) device_type_2(桶)  设备_1(kv)  设备_2(kv)项目2(桶) ...除了更新数据库之外,收到HTTP请求后还有一些其他事情要做,所以我使用这样的事务:tx, err := db.Begin(true)if err != nil {  return}defer tx.Rollback()// for simplicityprojectBkt := tx.From("project1")projectBkt.Save(&project)// other things.......if err := tx.Commit(); err != nil {  return}提交 Bolt 事务时很有可能出现锁等待,堆栈如下所示:goroutine 53 [semacquire, 5 minutes]:sync.runtime_SemacquireMutex(0xc000002560, 0x16a7f00, 0x0)        C:/Go/src/runtime/sema.go:71 +0x4esync.(*RWMutex).Lock(0xc000002558)        C:/Go/src/sync/rwmutex.go:103 +0xc0go.etcd.io/bbolt.(*DB).mmap(0xc0000023c0, 0x20000, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/bbolt@v1.3.0/db.go:246 +0x65go.etcd.io/bbolt.(*DB).allocate(0xc0000023c0, 0x1, 0x0, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/bbolt@v1.3.0/db.go:846 +0x24bgo.etcd.io/bbolt.(*Tx).allocate(0xc000e98fc0, 0x1, 0x0, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/bbolt@v1.3.0/tx.go:454 +0x79go.etcd.io/bbolt.(*node).spill(0xc0001539d0, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/bbolt@v1.3.0/node.go:368 +0x3f0go.etcd.io/bbolt.(*Bucket).spill(0xc0001cb740, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/bbolt@v1.3.0/bucket.go:541 +0x73ago.etcd.io/bbolt.(*Bucket).spill(0xc000e98fd8, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/bbolt@v1.3.0/bucket.go:508 +0x64fgo.etcd.io/bbolt.(*Tx).Commit(0xc000e98fc0, 0x0, 0x0)        D:/data/Go/pkg/mod/go.etcd.io/bbolt@v1.3.0/tx.go:163 +0x1bfgithub.com/asdine/storm.(*node).Commit(0xc0001cb380, 0x0, 0x0)        D:/data/Go/pkg/mod/github.com/asdine/storm@v2.1.2+incompatible/transaction.go:46 +0x5c.....问题是如何检测占用锁的 goroutine 以便检查整个操作顺序?
查看完整描述

1 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

Goroutines 没有外部 ID。

根据设计,可以在一个 Goroutine 中获取锁,并在另一个 Goroutine 中释放锁。因此,如果锁被持有,它并不是Goroutine 持有:任何人都可以解锁它,并且没有 ID 来记录谁锁定了它。

(因此,答案是,仅使用提供的互斥体,您无法看到谁占用了它。)


查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

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