最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言并發(fā)范式之future模式詳解

 更新時間:2023年06月15日 10:46:06   作者:242030  
編程中經(jīng)常遇到在一個流程中需要調(diào)用多個子調(diào)用的情況,此時就可以使用Go并發(fā)編程中的future模式,下面小編就來和大家聊聊future模式的具體使用,需要的可以參考一下

1、Go語言并發(fā)范式-future模式

編程中經(jīng)常遇到在一個流程中需要調(diào)用多個子調(diào)用的情況,這些子調(diào)用相互之間沒有依賴,如果串行地調(diào)用,則耗時會很長,此時可以使用Go并發(fā)編程中的future模式。

future模式的基本工作原理:

(1)、使用chan作為函數(shù)參數(shù)。

(2)、啟動goroutine調(diào)用函數(shù)。

(3)、通過chan傳入?yún)?shù)。

(4)、做其他可以并行處理的事情。

(5)、通過chan異步獲取結(jié)果。

package main
import (
	"fmt"
	"time"
)
// 一個查詢結(jié)構(gòu)體
// 這里的sql和result是一個簡單的抽象,具體的應(yīng)用,可能是更復(fù)雜的數(shù)據(jù)類型
type query struct {
	//參數(shù)Channel
	sql chan string
	//結(jié)果Channel
	result chan string
}
//執(zhí)行Query
func execQuery(q query) {
	//啟動協(xié)程
	go func() {
		//獲取輸入
		sql := <-q.sql
		//訪問數(shù)據(jù)庫
		//輸出結(jié)果通道
		q.result <- "result from " + sql
	}()
}
func main() {
	//初始化Query
	q := query{make(chan string, 1), make(chan string, 1)}
	//執(zhí)行Query,注意執(zhí)行的時候無需準備參數(shù)
	go execQuery(q)
	//準備參數(shù)
	q.sql <- "select * from table;"
	//do otherthings
	time.Sleep(1 * time.Second)
	//獲取結(jié)果
	fmt.Println(<-q.result)
}

程序輸出

result from select * from table;

future最大的好處是將函數(shù)的同步調(diào)用轉(zhuǎn)換為異步調(diào)用,適用于一個交易需要多個子調(diào)用且這些子調(diào)用沒有依賴

的場景。實際情況可能比上面示例復(fù)雜得多,要考慮錯誤和異常的處理,讀者著重體驗這種思想,而不是細節(jié)。

2、Future模式的實現(xiàn)步驟

(1)、構(gòu)建結(jié)構(gòu)體FutureTask

這里我們將要做的事情抽象成任務(wù),對于每個任務(wù)我們可能需要傳遞參數(shù)過去,并且我們還需要得到這個任務(wù)的執(zhí)行結(jié)果,為此,我們創(chuàng)建兩個channel,一個用于傳遞參數(shù),一個用于保存結(jié)果。(具體還需要什么其他的參數(shù)可以根據(jù)具體業(yè)務(wù)進行設(shè)計)。

// FutureTask 在并發(fā)執(zhí)行時用于傳遞參數(shù)和保存返回的結(jié)果
type FutureTask struct {
	// 用于傳遞參數(shù)
	args chan interface{}
	// 實際業(yè)務(wù)中可能還有很多其他的數(shù)據(jù)
	// 用于保存結(jié)果
	res chan interface{}
}

(2)、創(chuàng)建goroutine執(zhí)行future的方法

在創(chuàng)建好FutureTask之后,需要開啟goroutine去執(zhí)行,為此需要創(chuàng)建一個執(zhí)行FutureTask的方法:

// execFutureTask 用于開啟一個Future模式的線程
func execFutureTask(futureTask *FutureTask) {
	// 讀取傳入的參數(shù)
	fmt.Println("goroutine讀取到的參數(shù):", <-futureTask.args)
	// 這里可以執(zhí)行具體的業(yè)務(wù)邏輯
	result := "執(zhí)行完業(yè)務(wù)邏輯后得到的結(jié)果"
	// 將結(jié)果進行保存
	futureTask.res <- result
	defer close(futureTask.res)
	return
}

(3)、測試代碼

package main
import (
	"fmt"
	"time"
)
// FutureTask 在并發(fā)執(zhí)行時用于傳遞參數(shù)和保存返回的結(jié)果
type FutureTask struct {
	// 用于傳遞參數(shù)
	args chan interface{}
	// 實際業(yè)務(wù)中可能還有很多其他的數(shù)據(jù)
	// 用于保存結(jié)果
	res chan interface{}
}
// execFutureTask 用于開啟一個Future模式的線程
func execFutureTask(futureTask *FutureTask) {
	// 讀取傳入的參數(shù)
	fmt.Println("goroutine讀取到的參數(shù):", <-futureTask.args)
	// 這里可以執(zhí)行具體的業(yè)務(wù)邏輯
	result := "執(zhí)行完業(yè)務(wù)邏輯后得到的結(jié)果"
	// 將結(jié)果進行保存
	futureTask.res <- result
	defer close(futureTask.res)
	return
}
func main() {
	// 創(chuàng)建一個FutureTask并開啟一個goroutine去執(zhí)行
	futureTask := FutureTask{make(chan interface{}), make(chan interface{})}
	go execFutureTask(&futureTask)
	// 向FutureTask傳入?yún)?shù),如果不傳的話會死鎖
	futureTask.args <- "main線程傳入的參數(shù)"
	// 這里可以并行的去執(zhí)行一些其他業(yè)務(wù)邏輯
	time.Sleep(1 * time.Second)
	// 讀取線程執(zhí)行的
	fmt.Println("主線程讀取future模式下goroutine的結(jié)果:", <-futureTask.res)
}

(4)、執(zhí)行結(jié)果

程序輸出

goroutine讀取到的參數(shù): main線程傳入的參數(shù)
主線程讀取future模式下goroutine的結(jié)果: 執(zhí)行完業(yè)務(wù)邏輯后得到的結(jié)果

(5)、完整代碼

package main
import (
	"fmt"
	"time"
)
// FutureTask 在并發(fā)執(zhí)行時用于傳遞參數(shù)和保存返回的結(jié)果
type FutureTask struct {
	// 用于傳遞參數(shù)
	args chan interface{}
	// 實際業(yè)務(wù)中可能還有很多其他的數(shù)據(jù)
	// 用于保存結(jié)果
	res chan interface{}
}
// execFutureTask 用于開啟一個Future模式的線程
func execFutureTask(futureTask *FutureTask) {
	// 讀取傳入的參數(shù)
	fmt.Println("goroutine讀取到的參數(shù):", <-futureTask.args)
	// 這里可以執(zhí)行具體的業(yè)務(wù)邏輯
	result := "執(zhí)行完業(yè)務(wù)邏輯后得到的結(jié)果"
	// 將結(jié)果進行保存
	futureTask.res <- result
	defer close(futureTask.res)
	return
}
func main() {
	// 創(chuàng)建一個FutureTask并開啟一個goroutine去執(zhí)行
	futureTask := FutureTask{make(chan interface{}), make(chan interface{})}
	go execFutureTask(&futureTask)
	// 向FutureTask傳入?yún)?shù),如果不傳的話會死鎖
	futureTask.args <- "main線程傳入的參數(shù)"
	// 這里可以并行的去執(zhí)行一些其他業(yè)務(wù)邏輯
	time.Sleep(1 * time.Second)
	// 讀取線程執(zhí)行的
	fmt.Println("主線程讀取future模式下goroutine的結(jié)果:", <-futureTask.res)
}

到此這篇關(guān)于Go語言并發(fā)范式之future模式詳解的文章就介紹到這了,更多相關(guān)Go future模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go內(nèi)存緩存BigCache實現(xiàn)BytesQueue源碼解讀

    go內(nèi)存緩存BigCache實現(xiàn)BytesQueue源碼解讀

    這篇文章主要為大家介紹了go內(nèi)存緩存BigCache實現(xiàn)BytesQueue源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Golang實現(xiàn)斷點續(xù)傳功能

    Golang實現(xiàn)斷點續(xù)傳功能

    這篇文章主要為大家詳細介紹了Golang實現(xiàn)斷點續(xù)傳、復(fù)制文件功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • golang 后臺進程的啟動和停止操作

    golang 后臺進程的啟動和停止操作

    這篇文章主要介紹了golang 后臺進程的啟動和停止操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • go實現(xiàn)base64編碼的四種方式

    go實現(xiàn)base64編碼的四種方式

    本文主要介紹了go實現(xiàn)base64編碼的四種方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 在goland中配置gofmt的操作

    在goland中配置gofmt的操作

    這篇文章主要介紹了在goland中配置gofmt的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go中Gzip與json搭配實現(xiàn)數(shù)據(jù)壓縮demo

    Go中Gzip與json搭配實現(xiàn)數(shù)據(jù)壓縮demo

    這篇文章主要為大家介紹了Go中Gzip與json搭配使用壓縮數(shù)據(jù)的實現(xiàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • Go語言實現(xiàn)一個Http Server框架(二) Server的抽象

    Go語言實現(xiàn)一個Http Server框架(二) Server的抽象

    上一篇文章對http庫的基本使用做了說明,這篇文章主要介紹了如何實現(xiàn)一個簡單地httpServer,文中代碼示例非常詳細,感興趣的朋友可以參考下
    2023-04-04
  • go語言gin框架中間件詳解

    go語言gin框架中間件詳解

    在Go語言中,gin是一個常用的Web框架,用于構(gòu)建RESTful API和Web應(yīng)用程序。本文將通過代碼示例詳細介紹了gin框架中間件,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • go語言轉(zhuǎn)換json字符串為json數(shù)據(jù)的實現(xiàn)

    go語言轉(zhuǎn)換json字符串為json數(shù)據(jù)的實現(xiàn)

    本文主要介紹了go語言轉(zhuǎn)換json字符串為json數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • 通過Golang實現(xiàn)linux命令ls命令(命令行工具構(gòu)建)

    通過Golang實現(xiàn)linux命令ls命令(命令行工具構(gòu)建)

    這篇文章主要為大家詳細介紹了如何通過Golang實現(xiàn)一個linux命令ls命令(命令行工具構(gòu)建),文中的示例代碼講解詳細,具有一定的學(xué)習(xí)價值,感興趣的可以了解一下
    2023-01-01

最新評論

会理县| 乌拉特后旗| 万载县| 新津县| 海原县| 南华县| 改则县| 香河县| 文成县| 盐池县| 清水河县| 罗甸县| 深泽县| 九龙县| 监利县| 瓮安县| 长乐市| 沂水县| 田林县| 马龙县| 宿迁市| 梅河口市| 永定县| 文成县| 潼关县| 临安市| 承德县| 电白县| 龙井市| 旅游| 会东县| 文化| 亳州市| 彭泽县| 诸城市| 承德县| 芜湖市| 冕宁县| 页游| 栾城县| 阿拉尔市|