多工的使用模式

2022-05-16 06:41:25 字數 4034 閱讀 1537

全域性資源的載入(初始化), 多工中公共資源銷毀

// 初始化工作

// 1. 通過init 方法,僅執行一次,但是不能重複呼叫

// 模擬全域性配置

name string

ip string

version string

}func init()

// 2. 使用sync.once方法,保證我們**執行一次

// 銷毀全域性資源

var once sync.once

once.do(func())

}

編寫非同步任務方法要點: 任務內部啟動goroutine處理任務,並立即返

// 編寫乙個資料庫非同步處理任務(模擬)

func storagedata(data string)

}

非同步方法的基礎上,如果想處理非同步的結果,需要傳遞乙個**方法

注意: 編寫非同步的基礎上,加上**方法(處理結果)

// 編寫乙個非同步爬取web的方法

啟動多個子任務,等待子任務結束

不需要結果

需要結果的

// 1. 需要返回結果,僅需要完成任務即可

func calltasknorsult()

wg.add(5)

for i:=0;i<5;i++(i)

}wg.wait()

}// 2. 需要完成任務還需要返回結果,可能需要做後續處理

func calltaskresults() (i)

}//等待輸出結果

for i:=0;i<10;i++

}

func download()(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()  

} 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)

}

output:

2019/06/27 11:55:45 task #1 is working...

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...

context在net/http包中的演示

使用單程序實現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 變成了多工作業系統。眾所周知,當你開啟乙個應用程式然後退出,它仍然會保留在後台。當然,這會導...