1. 程式人生 > >GO語言通用生產消費模型

GO語言通用生產消費模型

pcmode.go

package pcmodel

import "sync"

type callback func(ch chan interface{})

type PCModel struct {
	wg *sync.WaitGroup
	ch chan interface{}
	Producer
	Consumer
}

type Producer struct {
	wg    *sync.WaitGroup
	ch    chan interface{}
	pfunc callback
}

type Consumer struct {
	wg    *sync.WaitGroup
	ch    chan interface{}
	cfunc callback
}

func NewPCModel(pfunc callback, cfunc callback) *PCModel {
	model := PCModel{}
	model.wg = &sync.WaitGroup{}
	model.ch = make(chan interface{})
	model.Producer = *NewProducer(model.wg, model.ch, pfunc)
	model.Consumer = *NewConsumer(model.wg, model.ch, cfunc)
	return &model
}

func NewProducer(wg *sync.WaitGroup, ch chan interface{}, f callback) *Producer {
	p := Producer{}
	p.wg = wg
	p.ch = ch
	p.pfunc = f
	return &p
}

func NewConsumer(wg *sync.WaitGroup, ch chan interface{}, f callback) *Consumer {
	c := Consumer{}
	c.wg = wg
	c.ch = ch
	c.cfunc = f
	return &c
}

func (p *Producer) Produce() {
	p.wg.Add(1)
	go func(ch chan interface{}) {
		defer p.wg.Done()
		p.pfunc(ch)
		close(ch)
	}(p.ch)
}

func (c *Consumer) Consume() {
	c.wg.Add(1)
	go func(ch chan interface{}) {
		defer c.wg.Done()
		c.cfunc(ch)
	}(c.ch)
}

func (pc *PCModel) Wait() {
	pc.wg.Wait()
}

使用方法如下:
package main

import (
	"fmt"
	"pcmodel"
)

func ImportData(ch chan interface{}) {
	for i := 0; i < 10; i++ {
		ch <- i
	}
}

func ExportData(ch chan interface{}) {
	for data := range ch {
		fmt.Println(data)
	}
}

func main() {
	pc := pcmodel.NewPCModel(ImportData, ExportData)
	pc.Produce()
	pc.Consume()
	pc.Wait()
}


相關推薦

GO語言通用生產消費模型

pcmode.go package pcmodel import "sync" type callback func(ch chan interface{}) type PCModel struct { wg *sync.WaitGroup ch chan int

JAVA 多線程制作大球吃小球 一、實現球的自動生成及運動 生產消費模型

生產者 tar thread ive 聯系 print random 線程 ram /*文章中用到的代碼只是一部分,需要源碼的可通過郵箱聯系我 [email protected]*/ 前幾天用多線程實現了創建小球並移動,想到大魚吃小魚,便突發奇想要寫一個大球吃小球。首先第一

Condition的await和signal原理詳解(Condition下的生產消費模型

Condition的await和signal與Object的wait與notify區別: 任何一個Java物件都天然繼承於Object類,線上程間實現通訊會用到Object的幾個方法,如wait(),wait(long timeout),wait(long timeout,int nan

生成器函式以及生產消費模型

1.生成器函式,即最終的輸出用yield替代return,其他形式不變的函式,而且相比於return,輸入yield函式不會立即停止 1 def test(): 2 print('你好') 3 return 10 4 def test_1(): 5 print('你好

Java生產消費模型—ArrayBlockingQueue詳解

正在 java類庫 otf 分享圖片 獲取 await poll() 放盤子 turn 背景需求   生產消費模型是線程協作關系中十分常見的一種。通常,一個(多個)線程負責生產,一個(多個)線程可以從生產的列表中獲取並消費;生產的內容可以按需求設計,可以是一個Intege

Go語言的面向對象模型初探

go 面向對象 Go語言的面向對象模型與主流OO語言差異很大,本文通過對比Go與C++的三個差異來介紹Go的面向對象模型及其設計思想。 一:可見性控制粒度是包Go用首寫字母的大小寫來控制類、類成員、函數的可見性, 可見性控制的粒度是包。下面是Go和C++對Person的實現:Go:type Person s

go語言-csp模型-併發通道

【前言】go語言的併發機制以及它所使用的CSP併發模型 一、CSP併發模型   CSP模型是上個世紀七十年代提出的,用於描述兩個獨立的併發實體通過共享的通訊 channel(管道)進行通訊的併發模型。 CSP中channel是第一類物件,它不關注傳送訊息的實體,而關注與傳送訊息時使用的chann

Go語言下的執行緒模型

閱讀Go併發程式設計對go語言執行緒模型的筆記,解釋的非常到,好記性不如爛筆頭,忘記的時候回來翻一番,在此做下筆記。 Go語言的執行緒實現模型,又3個必知的核心元素,他們支撐起了這個執行緒實現模型的主要框架: 1>M:Machine的縮寫。一個M代表一個核心執行緒。 2>P:Procecsso

2000行程式碼用go語言實現的比特幣基本的相關模型功能

|版權宣告:本文為博主原創文章,未經博主允許不得轉載。部落格地址:https://blog.csdn.net/sgsgy5 前言:閒暇時期,參考了一些資料,用go簡單的實現了比特幣中的一些相關功能,實現完全大概2000行程式碼左右,現在剛利用閒暇時間寫了一點小

Go語言記憶體模型

目錄: 名詞定義 執行體 - Go裡的Goroutine或Java中的Thread 背景介紹 記憶體模型的目的是為了定義清楚變數的讀寫在不同執行體裡的可見性。理解記憶體模型在併發程式設計中非常重要,因為程式碼的執行順序和書寫的邏輯順序並不會完全一致,甚至在編譯期

Go語言併發模型——goroutine

       Go語言裡的併發指的是能讓某個函式獨立於其他函式執行的能力。當一個函式建立為goroutine時,Go會將其視為一個獨立的工作單元。這個單元會被排程到可用的邏輯處理器上執行。Go語言執行時的排程器是一個複雜的軟體,能管理被建立的所有goroutine併為其分配執

Go語言模型:Linux執行緒排程 vs Goroutine排程

排程本質上體現了對CPU資源的搶佔。排程的方式可以分為: 搶佔式排程。依賴的是中斷機制,通過中斷搶回CPU執行許可權然後進行排程,如Linux核心對執行緒的排程。 協作式排程。需要主動讓出CPU,呼叫排程程式碼進行排程,如協程,沒有中斷機制一般無法真正做到搶佔

生產環境下go語言最佳實踐有感

最近看了一篇關於go產品開發最佳實踐的文章,go-in-procution。作者總結了他們在用go開發過程中的很多實際經驗,我們很多其實也用到了,鑑於此,這裡就簡單的寫寫讀後感,後續我也爭取能將這篇文章翻譯出來。後面我用soundcloud來指代原作者。開發環境在soundc

Go語言 | CSP併發模型與Goroutine的基本使用

今天是golang專題的第13篇文章,我們一起來聊聊golang當中的併發與Goroutine。 在之前的文章當中我們介紹完了golang當中常用的使用方法和規範,在接下來的文章當中和大家聊聊golang的核心競爭力之一,併發模型與Goroutine。 我們都知道併發是提升資源利用率最基礎的手段,尤其是當今大

詳解Go語言I/O多路複用netpoller模型

> 轉載請宣告出處哦~,本篇文章釋出於luozhiyun的部落格:https://www.luozhiyun.com > > 本文使用的go的原始碼15.7 可以從 Go 原始碼目錄結構和對應程式碼檔案瞭解 Go 在不同平臺下的網路 I/O 模式的實現。比如,在 Linux 系統下基於 epoll,free

Go語言之嵌入類型

go 類型 嵌入類型,或者嵌套類型,這是一種可以把已有的類型聲明在新的類型裏的一種方式,這種功能對代碼復用非常重要。在其他語言中,有繼承可以做同樣的事情,但是在Go語言中,沒有繼承的概念。Go提倡的代碼復用的方式是組合,所以這也是嵌入類型的意義所在。組合而不是繼承,所以Go才會更靈活。type Rea

go語言的優點

程序編寫 執行文件 語言培訓 多線程 老男孩 老男孩教育go語言培訓是國內首家go語言培訓機構,主講老師是小米架構資深架構師,有多年go開發經驗。小編現將go語言優點整理如下,希望能幫到你們 1.部署簡單Go 編譯生成的是一個靜態可執行文件,除了 glibc 外沒有其他外部依賴。這讓部署變

go語言筆記——append是內置的函數!!!new是一個函數!!!調試可以使用閉包,本質上是print調試,尼瑪!

... -c map blob 名稱 ebo bsp 處理機制 它的 內置函數 Go 語言擁有一些不需要進行導入操作就可以使用的內置函數。它們有時可以針對不同的類型進行操作,例如:len、cap 和 append,或必須用於系統級的操作,例如:panic。因此,它們需要直接

go語言筆記——切片函數常見操作,增刪改查和搜索、排序

通過 學習 strings 完整 官方文檔 二分 func fun 必須 7.6.6 搜索及排序切片和數組 標準庫提供了 sort 包來實現常見的搜索和排序操作。您可以使用 sort 包中的函數 func Ints(a []int) 來實現對 int 類型的切片排序。例如

go語言筆記——map map 默認是無序的,不管是按照 key 還是按照 value 默認都不排序

pcr 錯誤 固定 pre text 輸出結果 示例 operation frequency 示例 8.1 make_maps.go package main import "fmt" func main() { var mapLit map[string]int