當收到使用者請求時,程式會依呼叫的api進行不同操作,
如果沒特別設計的話,通常會以線性的方式處理,但是中間處理流程如果拖長,
使用者收到回應的速度也會變慢,如果慢到一定程度,
會造成使用者使用感不佳,這時go的並行處理就能派上用場了,
將中間處理的流程並行處理,就可以提高使用者的體驗。
在go裡面要使用他的並行功能,就需要了解goroutine。
當webserver主程式啟動時,其實是在一個main goroutine內執行,
而當我們要建立新的goroutine時,可以用go指令來建立。
func getUserData(sqlDriver *sql.DB, userID int64)(userData user, err error){
......
}
func updateUserData(sqlDriver *sql.DB, userID int64, newUserData user)(err error){
.....
}
上面那個函式內容假定為取出使用者資料以及更新使用者資料,
如果一個api請求內部,需要多次取出資料並更新資料,
照原本線性流程,會先處理第一筆,再來第二筆,直到最後一筆處理完,才回應給使用者,
類似下面範例。
for _, userID := range {
userData, err := getUserData(slaveDriver, userID)
if err !=nil {
}
//after update userData
updateUserData(master, userID)
}
以上面範例,會等for迴圈一筆一筆跑完,才回應使用者,造成流程時間拖長,
這時可以使用go指令來將中間流程放入goroutine內處理
for _, userID := range {
go func(){
userData, err := getUserData(slaveDriver, userID)
if err !=nil {
}
//after update userData
updateUserData(master, userID)
}()
}
這樣就可以將中間處理各自放入goroutine內處理,提高處理速度,
使用者也不會卡在那邊等了,不過這樣方式我們無法控制各個goroutine內的處理,
因此下一章會介紹channel,來達成goroutine之間的溝通。