全域性資源的載入(初始化), 多工中公共資源銷毀
// 初始化工作編寫非同步任務方法要點: 任務內部啟動goroutine處理任務,並立即返// 1. 通過init 方法,僅執行一次,但是不能重複呼叫
// 模擬全域性配置
name string
ip string
version string
}func init()
// 2. 使用sync.once方法,保證我們**執行一次
// 銷毀全域性資源
var once sync.once
once.do(func())
}
// 編寫乙個資料庫非同步處理任務(模擬)func storagedata(data string)
}
非同步方法的基礎上,如果想處理非同步的結果,需要傳遞乙個**方法注意: 編寫非同步的基礎上,加上**方法(處理結果)
// 編寫乙個非同步爬取web的方法啟動多個子任務,等待子任務結束不需要結果
需要結果的
// 1. 需要返回結果,僅需要完成任務即可func download()(i)func calltasknorsult()
wg.add(5)
for i:=0;i<5;i++(i)
}wg.wait()
}// 2. 需要完成任務還需要返回結果,可能需要做後續處理
func calltaskresults() (i)
}//等待輸出結果
for i:=0;i<10;i++
}
} // 等待子任務完成
log.println(
}
稍微複雜的一些業務,其中的乙個子任務需要另乙個子任務的結果// 非同步協作,任務b需要任務的計算結果func bwaita()
wg.add(2)
// 啟動任務a
go func() ()
// 啟動任務b
go func() ()
wg.wait()
}
某些特殊的情景下,我們可能需要取消子任務的執行,例如主任務因為使用者的原因,需要提前結束,通知所有的子任務結束func cancletask() )// 封裝乙個方法用於檢查 任務是否被取消了
iscancle:= func() bool
} //模擬啟動子任務
for i:=0;i<5;i++
log.printf("task #%d is working...\n",num)
time.sleep(time.millisecond *50)
}}(i)
} // 模擬任務執行一段時間
log.println("main working for an while...")
time.sleep(time.millisecond *100)
// 取消任務,利用關閉channel的廣播特性
close(canncle)
time.sleep(time.second)
}
當任務比較複雜的時候,更多情況可能是關聯任務,例如下圖這樣的多層任務使用context取消任務func cancelwithctx()output:} task:=func (ctx context.context, num int)
}}()
forlog.printf("task #%d is working...\n",num)
time.sleep(time.millisecond*200)
} }// 建立子ctx,用於取消
ctxone,cancelone:=context.withcancel(root)
go task(ctxone,1)
// 建立子ctx,用於取消
ctxtwo,_:=context.withcancel(root)
go task(ctxtwo,2)
// 模擬保證所有的goroutine都執行起來
time.sleep(time.second)
// 取消 第乙個任務
cancelone()
time.sleep(time.second)
}
2019/06/27 11:55:45 task #1 is working...context在net/http包中的演示2019/06/27 11:55:45 task #2 is working...
2019/06/27 11:55:46 task #1 is working...
2019/06/27 11:55:46 task #2 is working...
2019/06/27 11:55:46 task #1 is working...
2019/06/27 11:55:46 task #2 is working...
2019/06/27 11:55:46 task #1 is working...
2019/06/27 11:55:46 task #2 is working...
2019/06/27 11:55:46 task #1 is working...
2019/06/27 11:55:46 task #2 is working...
2019/06/27 11:55:46 task #1 sub is canceled!
2019/06/27 11:55:46 task #1 is canceled!
2019/06/27 11:55:46 task #2 is working...
2019/06/27 11:55:47 task #2 is working...
2019/06/27 11:55:47 task #2 is working...
2019/06/27 11:55:47 task #2 is working...
2019/06/27 11:55:47 task #2 is working...
使用單程序實現socket的多工模式(非堵塞)
from socket import 建立套接字 sersocket socket af inet,sock stream 設定埠復用 sersocket.setsockopt sol socket,so reuseaddr,1 localaddr 8888 繫結ip sersocket.bind ...
對 iOS 多工的誤解 多工原理
如今,多工這個有趣特性已經成功整合在裝置中,我們如今使用的智慧型手機完全支援多工,這其中有乙個東西尤其功不可沒。這就是蘋果的iphone手機。ios是使用廣泛的令人驚嘆的作業系統。在2010年之後ios 4 變成了多工作業系統。眾所周知,當你開啟乙個應用程式然後退出,它仍然會保留在後台。當然,這會導...
對 iOS 多工的誤解 多工原理
如今,多工這個有趣特性已經成功整合在裝置中,我們如今使用的智慧型手機完全支援多工,這其中有乙個東西尤其功不可沒。這就是蘋果的iphone手機。ios是使用廣泛的令人驚嘆的作業系統。在2010年之後ios 4 變成了多工作業系統。眾所周知,當你開啟乙個應用程式然後退出,它仍然會保留在後台。當然,這會導...