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

智能网站建设服务怎样淘宝seo排名优化

智能网站建设服务,怎样淘宝seo排名优化,设计工作室效果图,小熊源码网golang中的并发是函数相互独立运行的能力。Goroutines是并发运行的函数。Golang提供了 如何实现go协程 只需要在函数前面加上go即可 go task()package mainimport ("fmt""time" )func show(msg string) {for i : 0; i < 5; i {fmt.Printf("msg: …

golang中的并发是函数相互独立运行的能力。Goroutines是并发运行的函数。Golang提供了

  1. 如何实现go协程
    只需要在函数前面加上go即可
go task()
package mainimport ("fmt""time"
)func show(msg string) {for i := 0; i < 5; i++ {fmt.Printf("msg: %v\n", msg)time.Sleep(time.Microsecond * 1000)}
}func main() {go show("go show") //开辟goroutines中运行show("haha")       //这个会在main函数的goroutines中运行//注意协程是主进程的守护进程,主进程结束,协程就结束了,不管运没运行完fmt.Println("end..........")
}
  1. channel
    它是一个数据管道,可以往里面写数据,从里面读数据。
    channel 是 goroutine 之间数据通信桥梁,而且是线程安全的。
    channel 遵循先进先出原则。
    写入,读出数据都会加锁。
    channel 可以分为 3 种类型:
  • 只读 channel,单向 channel
  • 只写 channel,单向 channel
  • 可读可写 channel

channel 还可按是否带有缓冲区分为:

  • 带缓冲区的 channel,定义了缓冲区大小,可以存储多个数据
  • 不带缓冲区的 channel,只能存一个数据,并且只有当该数据被取出才能存下一个数据
unbuffered:=make(channel int)
buffered:=make(channel int,10)
package mainimport ("fmt""math/rand""time"
)var channeltest = make(chan int)func show(msg string) {value := rand.Intn(10)channeltest <- value // 往管道中写数据}func main() {defer close(channeltest) // 关闭管道go show("go show")       //开辟goroutines中运行time.Sleep(time.Second * 1)value := <-channeltest //从channel中获取数据fmt.Printf("value: %v\n", value)//注意协程是主进程的守护进程,主进程结束,协程就结束了,不管运没运行完fmt.Println("end..........")
}
  1. waitgroup实现同步
    类似于.net中的task wait,你可以取消下面wg 的试试看两者的区别,我们添加完wg后发现,a以及b函数都执行完毕
package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc a() {defer wg.Done()for i := 0; i < 10; i++ {fmt.Println("a函数")time.Sleep(time.Microsecond * 100)}
}func b() {defer wg.Done() //别忘了在一次执行完毕后运行这个函数for i := 0; i < 10; i++ {fmt.Println("b函数")time.Sleep(time.Microsecond * 100)}
}func main() {wg.Add(1) //在每一个go之前执行这个行数go a() //开辟goroutines中运行wg.Add(1)go b()wg.Wait()//注意协程是主进程的守护进程,主进程结束,协程就结束了,不管运没运行完fmt.Println("end..........")
}
  1. Mutex
    锁,用来解决同时访问全局变量
package mainimport ("fmt""runtime""sync""time"
)var wg sync.WaitGroup
var value int = 100
var lock sync.Mutexfunc a() {defer wg.Done()for i := 0; i < 100; i++ {lock.Lock()value += 1lock.Unlock()fmt.Println("a++")time.Sleep(time.Microsecond * 100)}
}func b() {defer wg.Done()for i := 0; i < 100; i++ {lock.Lock()value -= 1lock.Unlock()fmt.Println("a--")time.Sleep(time.Microsecond * 100)}
}func main() {fmt.Printf("runtime.NumCPU(): %v\n", runtime.NumCPU())runtime.GOMAXPROCS(8) //最大并发wg.Add(1)go a()wg.Add(1) //开辟goroutines中运行go b()wg.Wait()fmt.Println("end..........")fmt.Printf("value: %v\n", value)
}
  1. runtime包
  • runtime.Gosched() 让出CPU,重新等待安排任务
package mainimport ("fmt""runtime"
)func a() {for i := 0; i < 2; i++ {fmt.Println("a函数")}}func main() {fmt.Printf("runtime.NumCPU(): %v\n", runtime.NumCPU())runtime.GOMAXPROCS(8) //最大并发go a()                //开辟goroutines中运行for i := 0; i < 2; i++ {runtime.Gosched() //让出CPU,执行A函数fmt.Printf("i: %v\n", i)}fmt.Println("end..........")
}
  • runtime.Goexit() 退出协程
  • runtime.GOMAXPROCS(8) 最大并发
  1. select Switch
  • select是Go中的一个控制结构,类似于Switch语句,用于处理异步IO操作。select会监听语句中channel的读写操作,当case中channel读写操作为非阻塞状态时,将会触发相应的动作
  • select中的case语句必须是一个channel操作
  • select中的default自居总是可运行的
  • 如果有多个case都可以运行,select会随机公平的选出一个执行,其他不会执行
  • 如果没有可执行的case语句,且有default语句,那么会执行default
  • 如果没有可运行的case语句,且没有default语句,select将阻塞,知道某个case可以运行
package mainimport ("fmt""time"
)var valueint = make(chan int)
var valurstring = make(chan string)func main() {//关闭通道后会读取类型默认值,如int默认值为0go func() {valueint <- 100valurstring <- "haha"defer close(valueint)defer close(valurstring)}()for {select {case r := <-valueint:fmt.Printf("valueint: %v\n", r)case r := <-valurstring:fmt.Printf("valurstring: %v\n", r)default:fmt.Println("default .....")}time.Sleep(time.Second)}
}
  1. ticker
    ticker会一直运行,timer只运行一次
package mainimport ("fmt""runtime""time"
)var valueint = make(chan int)func main() {ticker := time.NewTicker(time.Second)//关闭通道后会读取类型默认值,如int默认值为0go func() {//每秒钟随机的往通道插入数据for _ = range ticker.C {select {case valueint <- 1:case valueint <- 2:case valueint <- 3:}}}()var sum intfor v := range valueint {fmt.Printf("v: %v\n", v)sum += vif sum >= 10 {runtime.Goexit()}}
}
http://www.15wanjia.com/news/56119.html

相关文章:

  • 网站运营阶段爱站长尾关键词挖掘工具
  • 建设银行日照网站企业信息查询
  • 佛山建网站永网搜索引擎营销的成功案例
  • 红酒 网站 模板百度云盘登录
  • 深圳市网站哪家做的好能去百度上班意味着什么
  • 好看的旅游网站模版品牌定位
  • 北京建设工程继续教育网站怎么优化网站排名才能起来
  • 网站建设厘金手指下拉12seo优化效果怎么样
  • 网站后台软件可以自己做吗网站结构
  • 门户网站建设方案中信息公开百度网站官网网址
  • 手机可怎么样做网站网站优化排名易下拉霸屏
  • 郑州58同城招聘网最新招聘百度推广优化怎么做的
  • 成都装修设计公司网站seo软文是什么
  • 做网站站长开通vip下载百度手机助手
  • 营销型网站建设空间必须是快排seo软件
  • 做远程培训网站用什么系统最近最新的新闻
  • wordpress网页后台优化大师优化项目有哪些
  • 郑州新感觉会所网站哪里做的佛山seo技术
  • 注册科技有限公司可以做网站吗日本产品和韩国产品哪个好
  • wordpress 加链接北京seo排名公司
  • 网络运营推广培训课程seo知识总结
  • 2015做网站前景seo比较好的公司
  • 定制网站建设多少钱长沙百度贴吧
  • 汤姆叔叔官方网站建设一个产品的宣传和推广方案
  • 企业网站做seo的必要性长沙关键词优化推荐
  • 开网站 怎么做网上支付seo课程培训要多少钱
  • 电商网站建设的关键武汉seo优化顾问
  • 做网站需要什么功能网站友链查询接口
  • 电子业网站建设谷歌优化教程
  • asp.net程序做的网站安全吗6最佳bt磁力猫