Go之并发处理(售票问题)
老问题:模拟一个售票窗口进行售票
先定义类型Ticket(车票)和Conductor(销售员)--偷懒了,把售票和产票都交给Conductor了
package util import () //--------------------------------
type Ticket struct {
ID int
Price string
Type string
} //--------------------------------
type Conductor struct {
Tickets []Ticket
Count int
} func NewConductor() *Conductor {
return &Conductor{make([]Ticket, 0), 0}
} func (this *Conductor) Sell() Ticket { temp := this.Tickets[0]
this.Tickets = this.Tickets[1:] return temp } func (this *Conductor) Product() Ticket {
ticket := Ticket{this.Count + 1, "$18", "成人票"}
this.Count = this.Count + 1
this.Tickets = append(this.Tickets, ticket)
return ticket
}
func main() {
conductor := util.NewConductor()
ticketCount := 100
temp := make(chan int, 100)
wg := new(sync.WaitGroup)
wg.Add(ticketCount * 2)
//一个线程产票,一个线程售票
for i := 0; i < ticketCount; i++ {
go func() {
defer wg.Done()
<-temp
fmt.Println("出售:", conductor.Sell())
}()
}
for i := 0; i < ticketCount; i++ {
go func() {
defer wg.Done()
temp <- i
fmt.Println("生产:", conductor.Product())
}()
}
wg.Wait()
}
输出结果
出售: {1 $18 成人票}
生产: {2 $18 成人票}
出售: {2 $18 成人票}
生产: {3 $18 成人票}
出售: {3 $18 成人票}
生产: {4 $18 成人票}
出售: {4 $18 成人票}
生产: {5 $18 成人票}
出售: {5 $18 成人票}
生产: {6 $18 成人票}
出售: {6 $18 成人票}
生产: {7 $18 成人票}
出售: {7 $18 成人票}
生产: {8 $18 成人票}
出售: {8 $18 成人票}
生产: {9 $18 成人票}
出售: {9 $18 成人票}
生产: {10 $18 成人票}
出售: {10 $18 成人票}
生产: {11 $18 成人票}
出售: {11 $18 成人票}
生产: {12 $18 成人票}
出售: {12 $18 成人票}
生产: {13 $18 成人票}
出售: {13 $18 成人票}
生产: {14 $18 成人票}
出售: {14 $18 成人票}
生产: {15 $18 成人票}
出售: {15 $18 成人票}
生产: {16 $18 成人票}
出售: {16 $18 成人票}
生产: {17 $18 成人票}
出售: {17 $18 成人票}
生产: {18 $18 成人票}
出售: {18 $18 成人票}
生产: {19 $18 成人票}
出售: {19 $18 成人票}
生产: {20 $18 成人票}
出售: {20 $18 成人票}
生产: {21 $18 成人票}
出售: {21 $18 成人票}
生产: {22 $18 成人票}
出售: {22 $18 成人票}
生产: {23 $18 成人票}
出售: {23 $18 成人票}
生产: {24 $18 成人票}
出售: {24 $18 成人票}
生产: {25 $18 成人票}
出售: {25 $18 成人票}
生产: {26 $18 成人票}
生产: {1 $18 成人票}
出售: {26 $18 成人票}
生产: {27 $18 成人票}
生产: {28 $18 成人票}
出售: {27 $18 成人票}
生产: {29 $18 成人票}
生产: {30 $18 成人票}
出售: {28 $18 成人票}
生产: {31 $18 成人票}
生产: {32 $18 成人票}
出售: {29 $18 成人票}
生产: {33 $18 成人票}
生产: {34 $18 成人票}
出售: {30 $18 成人票}
生产: {35 $18 成人票}
出售: {31 $18 成人票}
生产: {36 $18 成人票}
生产: {37 $18 成人票}
出售: {32 $18 成人票}
生产: {38 $18 成人票}
生产: {39 $18 成人票}
出售: {33 $18 成人票}
出售: {34 $18 成人票}
生产: {40 $18 成人票}
生产: {41 $18 成人票}
出售: {35 $18 成人票}
出售: {36 $18 成人票}
生产: {42 $18 成人票}
生产: {43 $18 成人票}
出售: {37 $18 成人票}
出售: {38 $18 成人票}
生产: {44 $18 成人票}
生产: {45 $18 成人票}
出售: {39 $18 成人票}
出售: {40 $18 成人票}
生产: {46 $18 成人票}
生产: {47 $18 成人票}
出售: {41 $18 成人票}
出售: {42 $18 成人票}
生产: {48 $18 成人票}
生产: {49 $18 成人票}
出售: {43 $18 成人票}
出售: {44 $18 成人票}
生产: {50 $18 成人票}
生产: {51 $18 成人票}
出售: {45 $18 成人票}
出售: {46 $18 成人票}
生产: {52 $18 成人票}
生产: {53 $18 成人票}
出售: {47 $18 成人票}
出售: {48 $18 成人票}
生产: {54 $18 成人票}
生产: {55 $18 成人票}
出售: {49 $18 成人票}
出售: {50 $18 成人票}
生产: {56 $18 成人票}
生产: {57 $18 成人票}
出售: {51 $18 成人票}
出售: {52 $18 成人票}
生产: {58 $18 成人票}
生产: {59 $18 成人票}
出售: {53 $18 成人票}
出售: {54 $18 成人票}
生产: {60 $18 成人票}
生产: {61 $18 成人票}
出售: {55 $18 成人票}
出售: {56 $18 成人票}
生产: {62 $18 成人票}
生产: {63 $18 成人票}
出售: {57 $18 成人票}
出售: {58 $18 成人票}
生产: {64 $18 成人票}
生产: {65 $18 成人票}
出售: {59 $18 成人票}
出售: {60 $18 成人票}
生产: {66 $18 成人票}
生产: {67 $18 成人票}
出售: {61 $18 成人票}
出售: {62 $18 成人票}
生产: {68 $18 成人票}
生产: {69 $18 成人票}
出售: {63 $18 成人票}
出售: {64 $18 成人票}
生产: {70 $18 成人票}
生产: {71 $18 成人票}
出售: {65 $18 成人票}
出售: {66 $18 成人票}
生产: {72 $18 成人票}
生产: {73 $18 成人票}
出售: {67 $18 成人票}
出售: {68 $18 成人票}
生产: {74 $18 成人票}
出售: {69 $18 成人票}
出售: {70 $18 成人票}
生产: {75 $18 成人票}
生产: {76 $18 成人票}
出售: {71 $18 成人票}
出售: {72 $18 成人票}
生产: {77 $18 成人票}
生产: {78 $18 成人票}
出售: {73 $18 成人票}
出售: {74 $18 成人票}
生产: {79 $18 成人票}
生产: {80 $18 成人票}
出售: {75 $18 成人票}
出售: {76 $18 成人票}
生产: {81 $18 成人票}
生产: {82 $18 成人票}
出售: {77 $18 成人票}
出售: {78 $18 成人票}
生产: {83 $18 成人票}
生产: {84 $18 成人票}
出售: {79 $18 成人票}
出售: {80 $18 成人票}
生产: {85 $18 成人票}
生产: {86 $18 成人票}
出售: {81 $18 成人票}
出售: {82 $18 成人票}
生产: {87 $18 成人票}
生产: {88 $18 成人票}
出售: {83 $18 成人票}
出售: {84 $18 成人票}
生产: {89 $18 成人票}
生产: {90 $18 成人票}
出售: {85 $18 成人票}
出售: {86 $18 成人票}
生产: {91 $18 成人票}
生产: {92 $18 成人票}
出售: {87 $18 成人票}
出售: {88 $18 成人票}
生产: {93 $18 成人票}
生产: {94 $18 成人票}
出售: {89 $18 成人票}
出售: {90 $18 成人票}
生产: {95 $18 成人票}
生产: {96 $18 成人票}
出售: {91 $18 成人票}
出售: {92 $18 成人票}
生产: {97 $18 成人票}
出售: {93 $18 成人票}
出售: {94 $18 成人票}
出售: {95 $18 成人票}
生产: {98 $18 成人票}
出售: {96 $18 成人票}
生产: {99 $18 成人票}
出售: {97 $18 成人票}
生产: {100 $18 成人票}
出售: {98 $18 成人票}
出售: {99 $18 成人票}
出售: {100 $18 成人票}
Go之并发处理(售票问题)的更多相关文章
- C# Entity Framework并发处理
原网站:C# Entity Framework并发处理 在软件开发过程中,并发控制是确保及时纠正由并发操作导致的错误的一种机制.从 ADO.NET 到 LINQ to SQL 再到如今的 ADO.NE ...
- JAVA多线程售票问题
//定义一个类实现Runnable接口,定义一个需要同步的售票方法,然后重写run方法调用售票的sale方法 class SaleTicket implements Runnable{ private ...
- WCF 的 Service Instance模式和并发处理
WCF 的 Service Instance(实例)有三种模式 PerCall:每一次调用都创建一个实例,每一次调用结束后回收实例.此模式完全无状态. PerSession:调用者打开Channel时 ...
- COGS247. 售票系统[线段树 RMQ]
247. 售票系统 ★★☆ 输入文件:railway.in 输出文件:railway.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 某次列车途经C个城市,城市 ...
- Android线程之并发处理
上一篇为大家介绍了关于Looper的简单知识,本篇我们介绍一下多线程的并发处理,我们知道Handler通过sendMessage()发送的消息,首先发送给了Looper,存入Looper的消息栈,之后 ...
- java 22 - 11 多线程之模拟电影院售票口售票
使用多线程实现的第二种方式: 首先创建自定义类 public class SellTicket implements Runnable { // 定义100张票 private int ticket ...
- 三、基础功能模块,用户类别管理——锁、EF并发处理、领域服务、应用服务的划分
在上一章节中,我们处理了MVC多级目录问题,参见<二.处理MVC多级目录问题——以ABP为基础架构的一个中等规模的OA开发日志>.从这章开始,我们将进入正式的开发过程.首先,我们要完成系统 ...
- python_way day10 python和其他语言的作用域 、 python2.7多继承和3.5多继承的区别 、 socket 和 socketserver源码(支持并发处理socket,多进程,多线程)
python_way day10 1.python的作用域和其他语言的作用域 2.python2.7多继承和3.5多继承的区别 3.socket和socketserver源码(并发处理socket) ...
- 事务并发处理: DB+ORM+逻辑代码
在学习了马士兵有关事务并发处理的视频后, 感觉对事务并发处理的概念,问题以及解决方式有了一定的了解,赶紧记录下来以备后用. 1. 事务:一系列操作要么都完成,要么一个都不完成 2. 事务并发:多个事务 ...
随机推荐
- VS2013安装MVC5
打开VS 选择 .net 4.5 创建项目 右击项目 选择管理NuGet 输入Microsoft.AspNet.Mvc -Version 5.0.0 安装最新版本的MVC5
- 在PHP中使用协程实现多任务调度
PHP5.5一个比较好的新功能是加入了对迭代生成器和协程的支持.对于生成器,PHP的文档和各种其他的博客文章已经有了非常详细的讲解.协程相对受到的关注就少了,因为协程虽然有很强大的功能但相对比较复杂, ...
- I/O模型(同步、非同步、阻塞、非阻塞)总结
I/O:同步(synchronous).异步(asynchronous).阻塞(blocking).非阻塞(nonblocking) 1.I/O内部机制 出于安全考虑,用户程序(用户态)是没办法直接操 ...
- Sword protobuf学习四
#include <iostream> #include <string> #include <sys/types.h> /* See NOTES */ #incl ...
- js放大镜代码
js原生放大镜 <!DOCTYPE html> <html> <head> <title>放大镜</title> <meta char ...
- SpringBoot系列八:SpringBoot整合消息服务(SpringBoot 整合 ActiveMQ、SpringBoot 整合 RabbitMQ、SpringBoot 整合 Kafka)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 整合消息服务 2.具体内容 对于异步消息组件在实际的应用之中会有两类: · JMS:代表作就是 ...
- e770. 确定按钮租中已选的单选按钮
When you ask a button group for the currently selected radio button, it returns the selected radio b ...
- tushare使用
tushare是获取行情数据的一款免费软件 使用方法很简单, 先安装:pip install tushare 然后 import tushare as ts 即可. data = ts.get_k ...
- 嵌入式开发值zynq驱动—— zynq SPI Flash 驱动过程
http://blog.csdn.net/pengwangguo/article/details/52292664 http://blog.csdn.net/pengwangguo/article/d ...
- Python——hashlib
该模块实现了诸多安全哈希和消息摘要算法的通用接口,包括 FIPS 安全哈希算法: SHA1, SHA224, SHA256, SHA384 和 SHA512 算法(在 FIPS 180-2 中定义), ...