标签:Map string sync mux Golang 线程 ExcuteResult interface data
1、使用互斥锁实现
2、Set\Get入口加锁
package main import ( "fmt" "sync" "time" ) var wg sync.WaitGroup // ExcuteResult 执行结果集 type ExcuteResult struct { data map[string]interface{} mux *sync.Mutex } // NewExcuteResult 创建一个执行结果集 func NewExcuteResult(data map[string]interface{}) *ExcuteResult { return &ExcuteResult{ data: data, mux: &sync.Mutex{}, } } // Get 获取结果集的元素-加锁保证并发安全 func (d *ExcuteResult) Get(key string) interface{} { d.mux.Lock() defer d.mux.Unlock() return d.data[key] } // Set 设置结果集的元素值-加锁保证并发安全 func (d *ExcuteResult) Set(key string, value interface{}) { d.mux.Lock() defer d.mux.Unlock() d.data[key] = value } func main() { excelData := []string{"1","2","3","4","5","6","7","8","9","10"} dict := NewExcuteResult(map[string]interface{}{}) for _,v := range excelData{ wg.Add(1) go readExcel(v,dict) // 通过管道阻塞协程执行 // <-ch } // 主协程让出时间片 - 但是不会一直等待-如果子协程sleep时间过于长也会直接往下执行 // runtime.Gosched() wg.Wait() fmt.Println("主协程结束") // 从管道拿数据 fmt.Println(dict) } func readExcel(v string,d *ExcuteResult)(result string){ fmt.Println(v) time.Sleep(time.Second) // 给管道写数据 // ch <- v d.Set(v,v) wg.Done() return v }
3、互斥锁 - sync.Mutex \ 读写锁 sync.RWMuTex
TRANSLATE with x English TRANSLATE with COPY THE URL BELOW Back EMBED THE SNIPPET BELOW IN YOUR SITE Enable collaborative features and customize widget: Bing Webmaster Portal Back
标签:Map,string,sync,mux,Golang,线程,ExcuteResult,interface,data 来源: https://www.cnblogs.com/xuweiqiang/p/16389979.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。