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

百度网站免费优化软件下载wordpress分类标签插件

百度网站免费优化软件下载,wordpress分类标签插件,济南浩特元辰建设工程有限公司网站,全国封城名单#x1f3f7;️个人主页#xff1a;鼠鼠我捏#xff0c;要死了捏的主页 #x1f3f7;️系列专栏#xff1a;Golang全栈-专栏 #x1f3f7;️个人学习笔记#xff0c;若有缺误#xff0c;欢迎评论区指正 前些天发现了一个巨牛的人工智能学习网站#xff0c;通俗易懂️个人主页鼠鼠我捏要死了捏的主页  ️系列专栏Golang全栈-专栏 ️个人学习笔记若有缺误欢迎评论区指正  前些天发现了一个巨牛的人工智能学习网站通俗易懂风趣幽默忍不住分享一下给大家。点击跳转到网站AI学习网站。 前言 当我们开发一个Web服务时我们希望可以同时处理成千上万的用户请求当我们有大量数据要计算时我们希望可以同时开启多个任务进行处理随着硬件性能的提升以及应用数据的增长有越来越多的场景需要高并发处理而高并发是Go的强项。 在这篇文章中我们就一起来探究一下Go并发编程 目录 前言 并发与并行 并发 并行 Goroutines 什么是Goroutine Goroutine的优势 启动Goroutine 关闭Goroutine Channel 什么是Channel 创建Channel Channel操作 发送与接收 关闭 遍历 无缓冲区Channel 有缓冲区Channel Channel的串联 单方向的channel select多路复用 Goroutine泄漏 小结 并发与并行 在谈Go并发编程之前我们需要对并发与并行做一下区分。 并发 并发是指有多个任务处于运行状态但无法确定到底任务的运行顺序比如某一时间有一个双核CPU但有10个任务(线程)这些任务可能随机被分配到相同或者不同的核心上去运行但是其运行顺序是不确定的。 并行 并行是指多个任务在某一个时刻同时运行比如某一个时刻一个双核心的CPU两个核心同时都有一个任务在运行那么就是说这两个任务是并行的。 Goroutines Goroutine是 Go语言的并发单元。 什么是Goroutine Goroutine中文称为协程我们可以把 Goroutine看作是一个轻量级的线程而从代码层面来看Goroutine就是一个独立运行的函数或方法。 Goroutine的优势 与线程相比创建一个Goroutine的开销要小得多一个Goroutine初始化时只需要2KB而一个线程则要2MB所以Go程序可以大量创建Goroutine进行并发处理。虽然协程初始化只有2KB但却可以根据需求动态扩展。Goroutine可以通过Channel互相通讯而线程只能通过共享内存互相通讯。Goroutine由Go调度器进行调度而线程则依赖系统的调度。 启动Goroutine 要启动一个Goroutine非常简单只要在函数或者方法前面加上 go关键字就可以了 package main func Hello(){fmt.Println(hello) }func main(){go Hello()//匿名函数go func(){fmt.Println(My Goroutine)}() }程序启动后 main函数单独运行在一个 Goroutine中这个 Goroutine称作 Main Goroutine其他用go关键字启动的Goroutine各自运行。 如果你在控制台运行上面的程序会发现在控制台根据没有任何输出这是为什么呢 原因在于虽然所有的Goroutine是独自运行的但如果 Man Gorouine终止的话那么所有 Goroutine 都会退出执行。 上面的示例中我们启动的 Goroutine还没运行main函数就执行结束了因此整个程序就退出了。 package main import timefunc Hello(){fmt.Println(hello) }func main(){go Hello()go func(){fmt.Println(My Goroutine)}()time.Sleep(time.Second) }上面的示例中我们调用 time.Sleep()函数让 Main Goroutine休眠而不退出这时候其他的Goroutine就可以在 Main Goroutine退出前执行。 关闭Goroutine Go没有提供关闭Goroutine的机制一般来说要让一个Goroutine停止有三种方式 random Goroutine执行完成退出或者 return退出main函数执行完成所有Goroutine自然就会终止直接终止整个程序的执行(程序崩溃或调用os.Exit())类似第2种方式。 Channel Go并发编程的思想是不要用共享内存来通讯而是用通讯来共享内存。而这种通讯机制就是Channel。 什么是Channel Channel是 Goroutine之间的通信机制可以把 Channel理解为 Goroutine之间的一条管道就像水可以从一个管道的一端流向另一端一样数据也可以通过 Channel从一个 Goroutine流向其他的一个 Goroutine以实现 Goroutine之间的数据通讯。 创建Channel 创建 Channel类型的关键字是 chan在 chan后面跟一个其他的数据类型用于表示该 channel可发送什么类型的数据比如一个可以发送整数的 Channel其定义是 var ch chan intChannel的默认值为nilChannel必须实例化后才能使用使用 make()函数实例化 ch make(chan int)ch1 : make(chan int)Channel与map一样是引用数据类型在调用make()函数后该Channel变量引用一块底层数据结构因此当把channel变量传递给函数时调用者与被调用者引用的是同一块数据结构。 Channel操作 Channel支持发送与接收两种操作无论是发送还是接收都是用 -运算符。 发送与接收 向Channel发送数据时运算符 -放在channel变量的右边运算符与Channel变量之间可以有空格 ch - x接收Channel数据时运算符 -放在channel变量的左边且之间不能有空格 x -ch x - ch //错误写法不接收channel的结果也是可以的 -ch一个示例 package mainimport fmtfunc main() {ch : make(chan int)go func(ch chan int) {ch - 10}(ch)m : -chfmt.Println(m) }关闭 使用内置 close可以关闭 Channel close(ch) 在关闭之后如果再对该channel发送数据会导致panic错误 close(ch) ch - x //panic如果Channel中还有值未被接收在关闭之后还可以接收Channel里的值如果没有值则返回一个0值。 package mainimport fmtfunc main() {ch : make(chan int)go func(ch chan int) {ch - 10close(ch) //关闭}(ch)m : -chn : -ch//10,0fmt.Println(m, n) }在从Channel接收值的时候也可以多接收一个布尔值如果为true,表示可以接收到有效值如果没有值则表示Channel被关闭且没有值 n,ok : -ch关闭一个已经关闭的Channel会导致panic,关闭一个nil值的Channel也会导致panic。 遍历 Channel也可以用for...range语句来遍历 package mainimport (fmttime )func main() {ch : make(chan int)go func(ch chan int) {ch - 10ch - 20}(ch)go func(ch chan int) {for c : range ch {fmt.Println(c)}}(ch)time.Sleep(time.Second) } 无缓冲区Channel 上面的示例中调用make()函数时没有指定第二个参数这时创建的Channel称为无缓冲区Channel。 对于使用无缓冲区进行通讯的两个Goroutine来说发送与阻塞都有可能会被阻塞因此本质使用无缓冲区的channel进行传输数据就是两个Goroutine之间的一次数据同步无缓冲区的Channel又被称为同步Channel package mainimport fmtfunc main() {ch : make(chan int)go func() {ch - 10}()fmt.Println(-ch) }有缓冲区Channel 调用 make()函数实例化 Channel时也可以通过该函数的第二个参数指定 Channel的容量 ch : make(chan int,2)通过 cap()和 len()函数可以 Channel的长度 cap(ch) //2 len(ch) //0 ch - 10 len(ch) //1对于带有缓冲区的Channel来说当Channel容量满了发送操作会阻塞当Channel空的时候接收操作会阻塞只有当Channel未满且有数据时发送与接收才不会发生阻塞。 Channel的串联 Channel是Goroutine之间沟通的管道日常生活中管道可以连接在一起水可以从一条管道流向另一条管道而Channel也是一样的数据可以从一个Channel流向另一个Channel。 package mainimport fmtfunc main() {ch1 : make(chan int)ch2 : make(chan int)go func() {for x : 0; x 100; x {ch1 - x}close(ch1)}()go func() {for {x, ok : -ch1if !ok {break}ch2 - x * x}close(ch2)}()for x : range ch2 {fmt.Println(x)} }单方向的channel 利用Channel进行通讯的大部分应用场景是一个Goroutine作为生产者只负责发送数据而另一个Goroutine作为消费者接收数据。 对于生产者来说不会对Channel执行接收的操作对于消费者来说不会对Channel执行发送的操作 在声明Channel变量将-运算符放在 chan关键前面则该Channel只能执行接收操作 //只允许接收 var ch1 -chan int在声明Channel变量将-运算符放在 chan关键字后面可以则该Channel只能执行发送操作: //只允许发送 var ch2 chan- int像我们前面那正常声明一个Channel变量则允许对该Channel执行发送和接收操作 //可以发送和接收 var ch3 chan int从一个只能发送数据的channel接收数据无法通过编译 var ch chan- int x : -ch //报错向一个只有接收数据的channel发送数据无法通过编译: var ch -chan int ch - 10 //报错对一个只有接收操作的 Channel执行 close()也无法通过编译: var ch -chan int close(ch) //报错select多路复用 前面的示例中我们在一个 Goroutine中只向一个 Channel发送数据或者只从一个 Channel接收数据因为如果同时向两个Channel接收或发送数据时如果第一个Channel没有事件响应程序会一直阻塞 package mainimport (fmttime )func main() {ch1 : make(chan int)ch2 : make(chan int)go func(ch1 chan int, ch2 chan int) {fmt.Println(向ch1发送数据前)-ch1fmt.Println(从ch2接收数据前)ch2 - 1}(ch1, ch2)time.Sleep(1 * time.Second) }但很多场景下我们需要在一个Goroutine中根据不同的Channel执行不同的操作比如一个启动的Web服务器在一个Goroutine中一边处理请求一边监听信号量。要怎么做呢 答案是使用select语句即多路复用select语法类似switch语句select语句块中可以包含多个case分支和一个default分支每个case分支表示一个向Channel发送或接收的操作select语句会选择可以执行的case分支来执行如果没有则执行default分支 select { case -ch1:// do something case x : -ch2:// do somthing with x case ch3 - y:// do something default:// dosomthing }下面我们通过一个案例来了解如何使用select语句在这个例子中我们模拟启动一个Web服务器处理来自用户的请求而在处理请求的同时还要可以根据接收的信息及时停止服务我们在开启单独的一个Goroutine模拟向我们的Web发送停止信号 package mainimport (fmttime )func main() {s : make(chan struct{})go func(s chan struct{}) {time.Sleep(time.Microsecond * 100)s - struct{}{}}(s)MyWebServer(s)fmt.Println(服务已停止...) }func MyWebServer(stop chan struct{}) {for {select {case -stop:fmt.Println(服务器接收到停止信号)returndefault:}//模拟处理请求go HandleQuery()} }func HandleQuery() {fmt.Println(处理请求...) }Goroutine泄漏 一个 Goroutine 由于从Channel接收或向 Channel 发送数据一直被阻塞一直无法往下执行时这种情况称为 Goroutine泄漏: package mainimport timefunc main() {ch : make(chan int)go func() {ch - 10}()time.Sleep(time.Second * 2) }Goroutine执行完成退出后由Go内存回收机制进行回收但是发生内存泄漏的Goroutine并不会被回收因此要避免发生这种情况。 总结 Go在语言层面支持并发编程只需要在函数或者方法前加上go关键字便可以启动一个Goroutine而Channel作为Goroutine之间的通讯管道可以非常方便Goroutine之间的数据通讯。
http://www.hkea.cn/news/14486781/

相关文章:

  • 网站安全设置教程公司展厅
  • 小白自己做网站快速建站哪个平台好
  • 企业网站的维护工作要怎么做网站开发实训的心得
  • 政务信息公开和网站建设自评听说上海又要封了
  • 福州 网站建设 快搜网络创意网站
  • 江西省美丽乡村建设公布网站天元建设集团有限公司单位代码
  • 广州网站设计成功柚米企业运营策划公司
  • 牡丹区建设局网站专业做网站 台州玉环
  • 公司网站 百度北京企业建设网站公司哪家好
  • asp网站 手机登录乐清网站开发
  • php网站开发意思上海网站优化排名公司
  • 重庆城乡规划和建设局网站橙色可以做哪些网站
  • 上海网站制作怎么选什么网站做谷歌联盟好
  • 杭州网站设计我选柚v米科技wordpress 多店铺
  • 如何看网站点击量seminar是什么意思
  • 建设工程管理网站网络优化网站 s
  • 优酷 做视频网站还能成功吗现成ppt免费下载
  • 网站主题下载手工制作大全简单漂亮
  • 响应式网站psd自己怎么做网址开网站
  • 什么是网站什么是网页c2c网站管理系统
  • 威海网站建设whhl即时设计是什么软件
  • 大连网站建浙江银安建设有限公司网站
  • pc网站同步手机网站做网站的需求调研
  • 太原网站维护国家建设部投诉网站
  • 深圳品牌网站推广公司哪家好做一些网站犯法么
  • 南通建公司网站软件商店官方下载
  • 养殖场网站模板望野
  • 网站运行与维护广东省网站备案注销
  • app开发和网站开发的区别品牌策划公司的市场
  • 西部数码助手网站后台管理温州市鹿城区建设小学网站