前言:

之前在学习操作系统的时候,就知道生产者-消费者,但是概念是模模糊糊的,好像是一直没搞明白。

其实很简单嘛,生产者生产,消费者进行消费,就是如此简单。了解了一下go语言的goroute,感觉实现并发原来可以如此简单,不像之前Java,什么还需要什么线程池啥的。

1、其实可以在一个go文件中可以实现的,按照go语言的开发习惯,按照标准的,定义三个包producer,consumer,main

2、producer.go

生产者每一秒产生一个header,一个随机数,并将它输出到管道pipe中。

package producer

import (
"fmt"
"math/rand"
"time"
)
func Produce(header string,pipe chan string ){
for{
pipe <- fmt.Sprintf("%s: %v",header,rand.Int31())
time.Sleep(time.Second)
} }

3、consumer.go

消费者从管道拿到数据,并进行输出。

package consumer

import("fmt")

func Consume(pipe chan string){
for{
message := <- pipe
fmt.Println(message)
} }

4、main.go

a、main是可执行的入口,并且得有个main函数,make用于定义一个管道,供生产者写入,消费者读数据

b、在这么简答的例子中,我们用到了go得并发特性,go是关键字,用于启动一个goroute,下面的main函数中,启动了两个producer的goroute生产数据,consumer利用main函数的goroute进行消费,在main开始执行后,他们是并发执行的。

package main

import(
"consumer"
“producer"
) func main(){
channel := make(chan string)
go producer.Produce("dog",channel)
go producer.Produce("cat",channel)
consumer.Consume(channel)
}

  

go语言实现生产者-消费者的更多相关文章

  1. go语言实现"生产者"和"消费者"的例子

    学习java的多线程的时候最经典的一个例子就是生产者消费者模型的例子,最近在研究go语言协程,发现go提供的sync包中有很多和java类似的锁工具,尝试着用锁工具配合协程实现一个"消费者& ...

  2. 生产者消费者问题c语言实现

    #include <stdio.h> #include <process.h> #include <Windows.h> //信号量与关键段 CRITICAL_SE ...

  3. Go语言协程并发---生产者消费者实例

    package main import ( "fmt" "strconv" "time" ) /* 改进生产者消费者模型 ·生产者每秒生产一 ...

  4. LabVIEW之生产者/消费者模式--队列操作 彭会锋

    LabVIEW之生产者/消费者模式--队列操作 彭会锋 本文章主要是对学习LabVIEW之生产者/消费者模式的学习笔记,其中涉及到同步控制技术-队列.事件.状态机.生产者-消费者模式,这几种技术在在本 ...

  5. java 生产者消费者问题 并发问题的解决

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

  6. 通过生产者消费者模式例子讲解Java基类方法wait、notify、notifyAll

    wait(),notify()和notifyAll()都是Java基类java.lang.Object的方法. 通俗解释wait():在当前线程等待其它线程唤醒.notify(): 唤醒一个线程正在等 ...

  7. 生产者/消费者问题的多种Java实现方式--转

    实质上,很多后台服务程序并发控制的基本原理都可以归纳为生产者/消费者模式,而这是恰恰是在本科操作系统课堂上老师反复讲解,而我们却视而不见不以为然的.在博文<一种面向作业流(工作流)的轻量级可复用 ...

  8. Java实现生产者消费者问题与读者写者问题

    摘要: Java实现生产者消费者问题与读者写者问题 1.生产者消费者问题 生产者消费者问题是研究多线程程序时绕不开的经典问题之一,它描述是有一块缓冲区作为仓库,生产者可以将产品放入仓库,消费者则可以从 ...

  9. java 生产者消费者问题 并发问题的解决(转)

    引言 生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,如下图所示,生产者向空间里存放数据,而消费者取用数据,如果不加以协调可能会出现以下情况: 生产者消费者图 ...

随机推荐

  1. 手动安装Package Control

    手动下载一个package control的包:https://github.com/wbond/package_control 然后Download ZIP后,解压,将解压后的文件夹重命名为 Pac ...

  2. [代码]解析nodejs的require,吃豆人的故事

    最近在项目中需要对nodejs的require关键字做解析,并且替换require里的路径.一开始我希望nodejs既然作为脚本语言,内核提供一个官方的parser库应该是一个稳定可靠又灵活的渠道,然 ...

  3. Spring 完成自动注入(autowire)

    目录 两个测试类 普通方式手动注入 普通方式注入的缺点 自动注入的介绍 配置自动注入的方式 配置全局自动注入 局部单独配置 利用注解实现自动注入 两个测试类 package cn.ganlixin.p ...

  4. ubuntu linux 安装分区

    挂载点/:主分区:安装系统和软件:大小为150G:分区格式为ext4: 挂载点/home:逻辑分区:相当于"我的文档":150G大小为硬盘剩下的; 分区格式ext4: swap:逻 ...

  5. P2801 教主的魔法(分块入门)

    两个月之前听yyr学长讲的分块,感觉是个很神奇的暴力,但到现在还是懵的一匹 #include<bits/stdc++.h> using namespace std; ; int belon ...

  6. bzoj4785:[ZJOI2017]树状数组:二维线段树

    分析: "如果你对树状数组比较熟悉,不难发现可怜求的是后缀和" 设数列为\(A\),那么可怜求的就是\(A_{l-1}\)到\(A_{r-1}\)的和(即\(l-1\)的后缀减\( ...

  7. Java遍历List5种方法的效率对比

    package com.test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** ...

  8. Python——代码汇总

    1.三级菜单 2.Windows启动服务 3.常用的Python实现 4.字典的基本操作

  9. codeforces305A

    Strange Addition CodeForces - 305A Unfortunately, Vasya can only sum pairs of integers (a, b), such ...

  10. python一(字符串,字典)

    list操作 name = ['小王','小米','小张','王强','张三','李四'] name.append('黄霑')#添加元素在最后一个 name.insert(,'王五')#指定下标插入元 ...