当前位置: 首页 > news >正文

企业网站建设方案及报价phpcms企业网站源码

企业网站建设方案及报价,phpcms企业网站源码,公司网站如何被百度收录,青岛网站制作公司网络1. goroutine Go语言通过go关键字来启动一个goroutine。注意#xff1a;go关键字后面必须跟一个函数#xff0c;不能是语句或者其他东西#xff0c;函数的返回值被忽略。 goroutine有如下特性#xff1a; go的执行是非阻塞的#xff0c;不会等待。go后面的函数的返回值…1. goroutine Go语言通过go关键字来启动一个goroutine。注意go关键字后面必须跟一个函数不能是语句或者其他东西函数的返回值被忽略。 goroutine有如下特性 go的执行是非阻塞的不会等待。go后面的函数的返回值会被忽略。调度器不能保证多个goroutine的执行次序。没有父子goroutine的概念所有的goroutine是平等地被调度和执行的。GO程序在执行时会单独为main函数创建一个goroutine遇到其他go关键字时再去创建其他的goroutine。GO没有暴露goroutine id给用户所以不能在一个goroutine里面显式地操作另一个goroutine不过runtime包提供了一些函数访问和设置goroutine的相关信息。 2. chan 通道 goroutine是Go语言里面的并发执行体chan是goroutine之间通信和同步的重要组件。 2.1 chan类型 //创建一个无缓冲通道通道存放元素为datatype make(chan datatype)//创建一个有10个缓冲的通道通道存放元素的类型为datatype make(chan datatype, 10) 操作不同状态的chan会引发三种行为 panic 向已经关闭的通道写数据会导致panic重复关闭的通道会导致panic 阻塞 向未初始化的通道写数据或读数据会导致当前goroutine的永久阻塞向缓冲区已满的通道写入数据会导致goroutine阻塞通道中没有数据读取该通道会导致goroutine阻塞 非阻塞 读取已经关闭的通道不会引发阻塞而是立即返回通道元素类型的零值可以使用comma, ok语法判断通道是否已经关闭。向有缓冲且没有满的通道读/写不会引发阻塞。 3. select select是类UNIX系统提供的一个多路复用系统APIGo语言借用多路复用的概念提供了select关键字用于多路监听多个通道。当监听的通道没有状态是可读或可写的select是阻塞的只要监听的通道中有一个状态是可读或者可写的则select就不会阻塞而是进入处理就绪通道的分支流程。如果监听的通道有多个可读或可写的状态则select随机选取一个处理。 4. Sync - 处理同步请求 当多个 goroutine 同时进行处理的时候就会遇到比如同时抢占一个资源某个 goroutine 等待另一个 goroutine 处理完某一个步骤之后才能继续的需求。 在 golang 的官方文档上作者明确指出golang 并不希望依靠共享内存的方式进行进程的协同操作。而是希望通过管道 channel 的方式进行。 当然golang 也提供了共享内存锁等机制进行协同操作的包。sync 包就是为了这个目的而出现的。 4.1 锁 sync 包中定义了 Locker 结构来代表锁。 type Locker interface {Lock()Unlock() }并且创造了两个结构来实现 Locker 接口Mutex 和 RWMutex。 4.1.1 Mutex 互斥锁 Mutex 就是互斥锁互斥锁代表着当数据被加锁了之后除了加锁的程序其他程序不能对数据进行读操作和写操作。 这个当然能解决并发程序对资源的操作。但是效率上是个问题。当加锁后其他程序要读取操作数据就只能进行等待了。 4.1.2 RWMutex 读写锁 读写锁分为读锁和写锁读数据的时候上读锁写数据的时候上写锁。有写锁的时候数据不可读不可写。有读锁的时候数据可读不可写。读写锁可以看下面的例子 package mainimport (synctime )var m *sync.RWMutex var val 0func main() {m new(sync.RWMutex)go read(1)go write(2)go read(3)time.Sleep(5 * time.Second) }func read(i int) {m.RLock()time.Sleep(1 * time.Second)println(val: , val)time.Sleep(1 * time.Second)m.RUnlock() }func write(i int) {m.Lock()val 10time.Sleep(1 * time.Second)m.Unlock() }返回 val: 0 val: 10 但是如果我们把 read 中的 RLock 和 RUnlock 两个函数给注释了就返回了 : val: 10 val: 10 这个就是由于读的时候没有加读锁在准备读取 val 的时候val 被 write 函数进行修改了。 4.2 Once 有的时候我们多个 goroutine 都要过一个操作但是这个操作我只希望被执行一次这个时候 Once 就上场了。比如下面的例子 : package mainimport (fmtsynctime )func main() {var once sync.OnceonceBody : func() {fmt.Println(Only once)}for i : 0; i 10; i {go func() {once.Do(onceBody)}()}time.Sleep(3e9) } 只会打出一次 Only once。 4.3 WaitGroup 和 Cond 一个 goroutine 需要等待一批 goroutine 执行完毕以后才继续执行那么这种多线程等待的问题就可以使用 WaitGroup 了。 package mainimport (fmtsync )func main() {wp : new(sync.WaitGroup)wp.Add(10);for i : 0; i 10; i {go func() {fmt.Println(done , i)wp.Done()}()}wp.Wait()fmt.Println(wait end) } 还有个 sync.Cond 是用来控制某个条件下goroutine 进入等待时期等待信号到来然后重新启动。比如 package mainimport (fmtsynctime )func main() {locker : new(sync.Mutex)cond : sync.NewCond(locker)done : falsecond.L.Lock()go func() {time.Sleep(2e9)done truecond.Signal()}()if (!done) {cond.Wait()}fmt.Println(now done is , done); } 这里当主 goroutine 进入 cond.Wait 的时候就会进入等待当从 goroutine 发出信号之后主 goroutine 才会继续往下面走。 sync.Cond 还有一个 BroadCast 方法用来通知唤醒所有等待的 gouroutine。 package mainimport (fmtsynctime )var locker new(sync.Mutex) var cond sync.NewCond(locker)func test(x int) {cond.L.Lock() // 获取锁cond.Wait() // 等待通知 暂时阻塞fmt.Println(x)time.Sleep(time.Second * 1)cond.L.Unlock() // 释放锁不释放的话将只会有一次输出 } func main() {for i : 0; i 40; i {go test(i)}fmt.Println(start all)cond.Broadcast() // 下发广播给所有等待的 goroutinetime.Sleep(time.Second * 60) } 主 gouroutine 开启后可以创建多个从 gouroutine从 gouroutine 获取锁后进入 cond.Wait 状态当主 gouroutine 执行完任务后通过 BroadCast 广播信号。 处于 cond.Wait 状态的所有 gouroutine 收到信号后将全部被唤醒并往下执行。需要注意的是从 gouroutine 执行完任务后需要通过 cond.L.Unlock 释放锁 否则其它被唤醒的 gouroutine 将没法继续执行。 通过查看 cond.Wait 的源码就明白为什么需要需要释放锁了 func (c *Cond) Wait() {c.checker.check()if raceenabled {raceDisable()}atomic.AddUint32(c.waiters, 1)if raceenabled {raceEnable()}c.L.Unlock()runtime_Syncsemacquire(c.sema)c.L.Lock() } Cond.Wait 会自动释放锁等待信号的到来当信号到来后第一个获取到信号的 Wait 将继续往下执行并从新上锁如果不释放锁 其它收到信号的 gouroutine 将阻塞无法继续执行。 由于各个 Wait 收到信号的时间是不确定的因此每次的输出顺序也都是随机的。 参考go 语言通道 chan 详解 二
http://www.w-s-a.com/news/889699/

相关文章:

  • 郑州做网站公司 汉狮网络专业图片搜集网站怎么做
  • 网站托管是什么品牌推广营销平台
  • 制作网站的难度贵州省兴义市建设局网站
  • 永春建设局网站室内设计师培训班学费多少
  • 做仿站如何获取网站源码windows2012做网站
  • 网站建设最好的公司东莞外贸网站
  • 普兰店网站建设一般做网站什么价格
  • 网站建设的发展目标甘肃网站设计公司
  • 常州西站建设规划室内装修设计学校哪里好
  • 大连网站制作选择ls15227如何编辑网站
  • 网站发稿平台迪士尼网站是谁做的
  • 常州有哪些好的网站建设案例wordpress 360 插件
  • 模板网站有后台么柳城网站建设
  • 地方门户网站制作一级做c爱片的网站
  • 自己上传图片做动漫图网站北京福田汽车
  • 一级a做爰片免费网站录像ps做网站图片水印
  • 网页广告投放成都优化推广公司
  • 网站开发 印花税网页制作站点
  • 创建个人网站有什么好处国外建站系统
  • 桂林学校网站制作2018年网站设计公司
  • 建网站不想用怎样撤销搜狗收录提交入口网址
  • 做简单网站需要学什么软件有哪些南通优普网站建设
  • 网站排版尺寸湖北交投建设集团集团网站
  • 南京网站设计公司有哪些公司看动漫是怎么做视频网站
  • vs做网站怎么做窗体怎么在电脑上自己做网站吗
  • 做网站应该学什么网站编程 外包类型
  • 双鱼儿 网站建设站群系统哪个好用
  • 怎样自己做刷赞网站电商设计需要学什么软件有哪些
  • 关注城市建设网站居众装饰
  • 网站建设的语言优化企业网站