package main import ( "fmt" "strconv" "time" ) /* 改进生产者消费者模型 ·生产者每秒生产一件商品,并通知物流公司取货 ·物流公司将商品运输到商店 ·消费者阻塞等待从商店消费 ·消费10轮就主协程结束 ·尝试在整分钟时通知生产者罢工,生产者罢工时主协程结束 ·计时协程,不断地查看有没有到整分钟 ·如果到整分钟,将[全局罢工变量]置为true ·生产者每完成一轮生产就查看[全局罢工变量],如果为tru…
package main import ( "fmt" "math" "strconv" "time" ) /* ·100条协程并发求1-10000平方根 ·最大并发数控制在5 ·管道实现 */ func GetSqrt(name string, n int, chSem chan string) { //想执行,先注册 //能写入就执行,写不进去就阻塞到能写入为止 chSem <- name ret := math.S…
package main import ( "fmt" "sync" "time" ) /* mt.Lock() 抢锁 一次只能被一个协程锁住 其余想要抢到这把锁的协程阻塞等待至前面的协程将锁释放 mt.Lock()的可能性有两种: ①抢到锁,继续向下执行 ②没抢到,阻塞等待至前面的协程将锁释放 ------------------------------------------- mt.Unlock() 解锁 锁一旦释放,其他抢这把锁的协程就会…
思路: yield可以使得函数阻塞,next,和send可以解阻塞,实现数据不竞争的生产者消费者模式 代码: import random #随机数,模拟生产者的制造物 def eat(): #消费者 while True: item = (yield) print("消费了:",item) def pro(g): #生产者 next(g) while True: item = random.randint(0,99) print("生产了:",item) g.sen…
协程的实现为协作式而非抢占式的,这是和进程线程的最大区别.在Python中,利用yield和send可以很容易实现协程. 首先复习下生成器. 如果一个函数使用了yield语句,那么它就是一个生成器函数.当调用这个函数时,它返回一个迭代器.当第一次调用__next__()时候,生成器函数主体开始执行,遇到yield表达式时候终止. 当使用__next__()方法时候,yield value语句返回None:当使用send(v)方法时候,yield value返回v.也就是说,__next__()方…
package main import ( "fmt" "sync" "time" ) func main() { //要监听的变量 bitcoinRising := false //创建条件 cond := sync.NewCond(&sync.Mutex{}) go func() { for { /*加锁修改为涨,并通知投资者*/ cond.L.Lock() bitcoinRising = true cond.Broadcast()…
package main import ( "fmt" "sync" "time" ) /* 读写锁 多路只读 一路只写 读写互斥 */ /*读写锁API介绍*/ func main101() { var rwm sync.RWMutex //锁定为写模式---一路只写 rwm.Lock() //解锁写模式 rwm.Unlock() //锁定为读模式---多路只读 rwm.RLock() //释放读写锁 rwm.RUnlock() } /* 数据…
package main import ( "fmt" "sync" "time" ) /*等待组API介绍*/ func main071() { var wg sync.WaitGroup fmt.Println(wg) //向等待组添加一个协程(注册) wg.Add(1) //从等待组减掉一个协程(注销) wg.Done() //阻塞等待至等待组中的协程数归零 wg.Wait() } /* ·分别使用Ticker和Timer创建耗时协程A,B…
package main import ( "fmt" "sync/atomic" ) /* 用原子来替换锁,其主要原因是: 原子操作由底层硬件支持,而锁则由操作系统提供的API实现 若实现相同功能,原子操作通常会更有效率 */ func main() { var a int64 = 123 //保证将456赋值到a的地址中(期间a一定不会被其他人访问) atomic.StoreInt64(&a, 456) fmt.Println(a) //456 a =…
秒表 package main import ( "fmt" "time" ) /*每秒大喊我要去浪,共9次,然后退出计时*/ func main() { var tickerStopped = false ticker := time.NewTicker(time.Second) go func() { time.Sleep(9 * time.Second) ticker.Stop() tickerStopped = true }() for { if ticke…