生产者消费者模型(基于go实现)

这篇具有很好参考价值的文章主要介绍了生产者消费者模型(基于go实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


基于 Channel 编写一个简单的单线程生产者消费者模型: 队列: 队列长度 10,队列元素类型为 int 生产者: 每 1 秒往队列中放入一个类型为 int 的元素,消费者: 每一秒从队列中获取一个元素并打印。

1.生产者消费者问题

版本1 未添加wait控制

package main

import (
	"fmt"
	"time"
)

func product(ch chan int) {
	for {
		ch <- 1
		time.Sleep(time.Second)
		fmt.Println("ch put:", 1)
	}

}

func custom(ch chan int) {
	for v := range ch {
		time.Sleep(time.Second)
		fmt.Println("ch get:", v)
	}

}

func main() {
	fmt.Println("main start product and custom problom")
	ch := make(chan int, 10)
	go product(ch)
	go custom(ch)
	time.Sleep(30 * time.Second)

}

版本2 添加wait控制

package main

import (
	"fmt"
	"sync"
	"time"
)

func product(ch chan int, wg *sync.WaitGroup) {
	defer wg.Done()
	for {
		ch <- 1
		time.Sleep(time.Second)
		fmt.Println("ch put:", 1)
	}
}

func custom(ch chan int, wg *sync.WaitGroup) {
	defer wg.Done()
	for v := range ch {
		time.Sleep(time.Second)
		fmt.Println("ch get:", v)
	}
}

func main() {
	fmt.Println("main start product and custom problem")
	ch := make(chan int, 10)
	var wg sync.WaitGroup
	wg.Add(2)

	go product(ch, &wg)
	go custom(ch, &wg)

	wg.Wait()
	close(ch)
	fmt.Println("main exit")
}

版本3 不添加wait控制

package main

import (
	"fmt"
	"time"
)

func producer(queue chan int) {
	for i := 0; ; i++ {
		queue <- i
		fmt.Printf("product get %d\n", i)
		time.Sleep(time.Second)
	}
}

func consumer(queue chan int) {
	for {
		item := <-queue
		fmt.Printf("custom get  %d\n", item)
		time.Sleep(time.Second)
	}
}

func main() {
	queue := make(chan int, 10)

	go producer(queue)
	consumer(queue)
}

2.添加条件当channel为空或为满时阻塞

基于 Channel 编写一个简单的单线程生产者消费者模型: 队列: 队列长度 10,队列元素类型为 int 生产者: 每 1 秒往队列中放入一个类型为 int 的元素,队列满时输出product full 消费者: 每一秒从队列中获取一个元素并打印,队列为空时输出custom null。文章来源地址https://www.toymoban.com/news/detail-669950.html

package main

import (
	"fmt"
	"time"
)

func main() {
	ch := make(chan int, 10) // 设置缓冲区大小为1

	go func() {
		for i := 0; ; i++ {
			val := i
			select { //如果通道已经存满,就会执行 default
			// 写数据
			case ch <- val:
				fmt.Printf("put %d into channel\n", val)
				time.Sleep(500 * time.Millisecond)
			default:
				time.Sleep(time.Second)
				fmt.Println("channel full")

			}
		}
	}()

	for {
		select { //如果通道已经存满,就会执行 default
		// 写数据
		case val := <-ch:
			fmt.Printf("get %d out of channel\n", val)
			time.Sleep(time.Second)
		default:
			time.Sleep(time.Second)
			fmt.Println("channel null")

		}
	}
}

到了这里,关于生产者消费者模型(基于go实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java系列】多线程案例学习——基于阻塞队列实现生产者消费者模型

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得,欢迎大家在评论区交流讨论💌 什么是阻塞式队列(有两点): 第一点:当队列满的时候

    2024年02月04日
    浏览(52)
  • 【Linux】POSIX信号量 | 基于环形队列的生产者消费者模型

    ​🌠 作者:@阿亮joy. 🎆 专栏: 《学会Linux》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 POSIX 信号量和 SystemV 信号量作用相同,都是用于同步操作,达到无冲突的访问共享资源目的。 但 POSIX 可以用于

    2023年04月08日
    浏览(62)
  • 【Linux学习】多线程——同步 | 条件变量 | 基于阻塞队列的生产者消费者模型

    🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言: 你只管努力,剩下的交给时间! 以生活中消费者生产者为例: 生活中,我们大部分人都扮演着消费者的角色,会经常在超市买东西,比如买方便面,而超市的方便面是由供应商生成的。所以我们就是消费者,供应商

    2024年02月05日
    浏览(50)
  • 【Linux】生产者消费者模型:基于阻塞队列和环形队列 | 单例模式线程池

    死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。 当多线程并发执行并都需要访问临界资源时,因为每个线程都是不同的执行流,这就有可能 导致数据不一致问题 ,为了避免此问题的发生

    2024年01月24日
    浏览(47)
  • 生产者-消费者模型

    目录 1、生产者-消费者模型是什么 2、Java中的实现 3、应用于消息队列 3.1 引入依赖 3.2 rabbitmq网站新建队列queue 3.3 模块中配置application.yml 3.4 生产者实现类 3.5 单元测试,发送msg到rabbitmq的队列(my_simple_queue) 3.6 消费者实现类 3.7 从rabbitmq队列(my_simple_queue)消费数据 3.8 队列的配

    2024年02月06日
    浏览(39)
  • Python多线程Thread——生产者消费者模型 python队列与多线程——生产者消费者模型

    下面面向对象的角度看线程 那么你可以试试看能不能用面向对象的方法实现生产者消费者模型吧。

    2024年02月09日
    浏览(52)
  • 线程同步--生产者消费者模型

    条件变量是 线程间共享的全局变量 ,线程间可以通过条件变量进行同步控制 条件变量的使用必须依赖于互斥锁以确保线程安全,线程申请了互斥锁后,可以调用特定函数 进入条件变量等待队列(同时释放互斥锁) ,其他线程则可以通过条件变量在特定的条件下唤醒该线程( 唤醒后线

    2024年01月19日
    浏览(39)
  • Linux——生产者消费者模型

    目录 一.为何要使用生产者消费者模型  二.生产者消费者模型优点  三.基于BlockingQueue的生产者消费者模型 1.BlockingQueue——阻塞队列 2.实现代码  四.POSIX信号量 五.基于环形队列的生产消费模型 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者

    2024年02月08日
    浏览(43)
  • linux:生产者消费者模型

    个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C++》《Linux》 本文是对于生产者消费者模型的知识总结 生产者消费者模型就是通过一个容器来解决生产者消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而是通过之间的容器来进行通讯,所以生产者

    2024年04月15日
    浏览(41)
  • 【Linux学习】多线程——信号量 | 基于环形队列的生产者消费者模型 | 自旋锁 | 读写锁

    🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言: 你只管努力,剩下的交给时间! 之前在学习进程间通信的时候,本喵简单的介绍过一下信号量,今天在这里进行详细的介绍。 这是之前写的基于阻塞队列的生产者消费者模型中向阻塞队列中push任务的代码。 上面代码

    2024年02月07日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包