// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. package goman import ( "log" "runtime" "sync" "time" ) var locker = &sync.Mutex{} var instanceMap = map[uint64]*Instance{} // id => *Instance var instanceId = uint64(0) // New 新创建goroutine func New(f func()) { _, file, line, _ := runtime.Caller(1) go func() { defer func() { if r := recover(); r != nil { log.Printf("[GOMAN]goroutine panic at %s:%d: %v", file, line, r) } }() locker.Lock() instanceId++ var instance = &Instance{ Id: instanceId, CreatedTime: time.Now(), } instance.File = file instance.Line = line instanceMap[instanceId] = instance locker.Unlock() // run function f() locker.Lock() delete(instanceMap, instanceId) locker.Unlock() }() } // NewWithArgs 创建带有参数的goroutine func NewWithArgs(f func(args ...interface{}), args ...interface{}) { _, file, line, _ := runtime.Caller(1) go func() { defer func() { if r := recover(); r != nil { log.Printf("[GOMAN]goroutine panic at %s:%d: %v", file, line, r) } }() locker.Lock() instanceId++ var instance = &Instance{ Id: instanceId, CreatedTime: time.Now(), } instance.File = file instance.Line = line instanceMap[instanceId] = instance locker.Unlock() // run function f(args...) locker.Lock() delete(instanceMap, instanceId) locker.Unlock() }() } // List 列出所有正在运行goroutine func List() []*Instance { locker.Lock() defer locker.Unlock() var result = []*Instance{} for _, instance := range instanceMap { result = append(result, instance) } return result }