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

深圳做公司网站推广的电子商务网站建设课程设计思路

深圳做公司网站推广的,电子商务网站建设课程设计思路,企业网站优化是什么,短域名转换#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.w-s-a.com/news/352984/

相关文章:

  • 开封网站建设培训郑州高端网站建设哪家好
  • 东莞哪家做网站很有名的公司即墨专业医院网站制作公司
  • 做面食网站china cd wordpress
  • 门户网站 营销优秀建筑模型案例作品
  • 训做网站的心得体会范文中山市 有限公司网站建设
  • 服装电子商务网站建设过程与实现两学一做学习教育网站
  • 住房和城建设网站怎么用源码建站
  • 监理工程师证查询网站百度关键词优化软件网站
  • 关于建筑建设的网站asp网站建设报告书
  • 服务二级公司网站建设平台销售模式有哪些
  • 南昌县建设局网站微信分销小程序开发
  • 网站设计师需要什么知识与技能wordpress个性
  • 做茶叶网站的目的和规划有什么做照片书的网站
  • 开福区城乡建设局门户网站关键词挖掘查询工具爱站网
  • 网站建设全国排名沈阳seo按天计费
  • 成都公司网站设计无锡seo网站推广费用
  • 建网站平台要多少钱购物网站界面设计策划
  • 学完js了可以做哪些网站长沙建站官网
  • 怎么样做问卷网站多少钱英语
  • 房产网站建设方案建筑公司是干什么的
  • wordpress建的大型网站柳州市网站建设
  • 石家庄做网站的公司有哪些微信自媒体网站建设
  • 池州哪里有做网站注册公司有哪些风险
  • 做古代风格头像的网站对网站政务建设的建议
  • 网站搜索栏怎么做设计个网站要多少钱
  • 阿里巴巴网站建设目标wamp wordpress
  • 自己做的网站怎么挂网上金蝶erp
  • 网站的页面由什么组成淘宝网网站建设的需求分析
  • 软文网站推广法dede5.7内核qq个性门户网站源码
  • 个人备案网站名称校园网站建设特色