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

鸡西市网站建设_网站建设公司_定制开发_seo优化

天津网站建设q479185700惠,百度目前的推广方法,网站建设一对一培训,建站 公司Don’t communicate by sharing memory;share memory by communicating. 从Go语言编程的角度解释#xff0c;这句话的意思就是#xff1a;不要通过共享数据来通讯#xff0c;恰恰相反#xff0c;要以通讯的方式共享数据。 进程和线程 进程#xff0c;描述的就是程序的执… Don’t communicate by sharing memory;share memory by communicating. 从Go语言编程的角度解释这句话的意思就是不要通过共享数据来通讯恰恰相反要以通讯的方式共享数据。 进程和线程 进程描述的就是程序的执行过程是运行着的程序的代表。换句话说一个进程其实就是某个程序运行时的一个产物。如果说静静地躺在那里的代码就是程序的话那么奔跑着的、正在发挥着既有功能的代码就可以被称为进程。 我们的电脑为什么可以同时运行那么多应用程序我们的手机为什么可以有那么多App同时在后台刷新这都是因为它们的操作系统之上有多个代表着不同应用程序或App的进程同时运行。 线程线程总是在进程之内的它可以被视为进程中运行着的控制流或者代码执行的流程。 一个进程至少会包含一个线程。如果一个进程只包含了一个线程那么它里面的所有代码都只会被串行的执行。每个进程的第一个线程都会随着该进程的启动而被创建它们可以被称为其所属进程的主线程。 相对应的如果一个进程中包含了多个线程那么其中的代码就可以被并发地执行。 也就是说主线程之外的其他线程都只能由代码显式地创建和销毁。这需要我们在编写程序的时候进行手动控制操作系统以及进程本身并不会帮我们下达这样的命令它们只会忠实地执行我们的指令。 不过在 Go 程序当中Go 语言的运行时runtime系统会帮助我们自动地创建和销毁系统级的线程。这里的系统级线程指的就是我们刚刚说过的操作系统提供的线程。 而对应的用户级线程指的是架设在系统级线程之上的由用户或者说我们编写的程序完全控制的代码执行流程。用户级线程的创建、销毁、调度、状态变更以及其中的代码和数据都完全需要我们的程序自己去实现和处理。 这带来了很多优势比如因为它们的创建和销毁并不用通过操作系统去做所以速度会很快又比如由于不用等着操作系统去调度它们的运行所以往往会很容易控制并且可以很灵活。 但是劣势也是有的最明显也最重要的一个劣势就是复杂。如果我们只使用了系统级线程那么我们只要指明需要新线程执行的代码片段并且下达创建或销毁线程的指令就好了其他的一切具体实现都会由操作系统代劳。 如果使用用户级线程我们就不得不既是指令下达者又是指令执行者。我们必须全权负责与用户级线程有关的所有具体实现。 操作系统不但不会帮忙还会要求我们的具体实现必须与它正确地对接否则用户级线程就无法被并发地甚至正确地运行。毕竟我们编写的所有代码最终都需要通过操作系统才能在计算机上执行。这听起来就很麻烦不是吗 不过Go语言不但有着独特的并发编程模型以及用户级线程goroutine还拥有强大的用于调度goroutine、对接系统级线程的调度器。 这个调度器是Go语言运行时系统的重要组成部分它主要负责统筹调配Go并发编程模型中的三个主要元素即Ggoroutine的缩写、Pprocessor的缩写和Mmachine的缩写。 其中的M指代的就是系统级线程。而P指的是一种可以承载若干个G且能够使这些G适时地与M进行对接并得到真正运行的中介。 从宏观上说G 和 M 由于 P 的存在可以呈现出多对多的关系。当一个正在与某个 M 对接并运行着的G需要因某个事件比如等待 I/O 或锁的解除而暂停运行的时候调度器总会及时地发现并把这个 G 与那个 M 分离开以释放计算资源供那些等待运行的 G 使用。 而当一个 G 需要恢复运行的时候调度器又会尽快地为它寻找空闲的计算资源包括 M并安排运行。另外当 M 不够用时调度器会帮我们向操作系统申请新的系统级线程而当某个 M 已无用时调度器又会负责把它及时地销毁掉。 正因为调度器帮助我们做了很多事所以我们的 Go 程序才总是能高效地利用操作系统和计算机资源。程序中的所有 goroutine 也都会被充分地调度其中的代码也都会被并发地运行即使这样的 goroutine 有数以十万计也仍然可以如此。 什么是goroutine它与我们启用的其他goroutine有什么不同 package main import fmt func main() {for i : 0; i 10; i {go func() {fmt.Println(i)}() } }问题这个命令源码文件被执行后会打印出什么内容 回答不会有任何内容被打印出来。 问题解析 与一个进程总会有一个主线程类似每一个独立的Go程序在运行时总会有一个主goroutine。这个主goroutine会在Go程序的运行准备工作完成后被自动地启用并不需要我们做任何手动的操作。 每条go语句一般都会携带一个函数调用这个被调用的函数常常被称为go函数。而主goroutine的go函数就是那个程序入口的main函数。 注意go函数真正被执行的时间总会与其所属的go语句被执行的时间不同。当程序执行到一条go语句的时候Go 语言的运行时系统会先试图从某个存放空闲的 G 的队列中获取一个 G也就是goroutine它只有在找不到空闲 G 的情况下才会去创建一个新的 G。 然而创建 G 的成本也是非常低的。创建一个 G 并不会像新建一个进程或者一个系统级线程那样必须通过操作系统的系统调用来完成在 Go 语言的运行时系统内部就可以完全做到了更何况一个 G 仅相当于为需要并发执行代码片段服务的上下文环境而已。 在拿到了一个空闲的 G 之后Go 语言运行时系统会用这个 G 去包装当前的那个go函数或者说该函数中的那些代码然后再把这个 G 追加到某个存放可运行的 G 的队列中。这类队列中的 G 总是会按照先入先出的顺序很快地由运行时系统内部的调度器安排运行。虽然这会很快但是由于上面所说的那些准备工作还是不可避免的所以耗时还是存在的。 因此go函数的执行时间总是会明显滞后于它所属的go语句的执行时间。当然了这里所说的“明显滞后”是对于计算机的 CPU 时钟和 Go 程序来说的。我们在大多数时候都不会有明显的感觉。 只要go语句本身执行完毕Go 程序完全不会等待go函数的执行它会立刻去执行后边的语句。这就是所谓的异步并发地执行。 for i : 0; i 10; i {go func() {fmt.Println(i)}() }这里“后边的语句”指的一般是for语句中的下一个迭代。然而当最后一个迭代运行的时候这个“后边的语句”是不存在的。 在上述代码中的那条for语句会以很快的速度执行完毕。当它执行完毕时那 10 个包装了go函数的 goroutine 往往还没有获得运行的机会。 go函数中的那个对fmt.Println函数的调用是以for语句中的变量i作为参数的。你可以想象一下如果当for语句执行完毕的时候这些go函数都还没有执行那么它们引用的变量i的值将会是什么 它们都会是10对吗那么这道题的答案会是“打印出 10 个10”是这样吗 在确定最终的答案之前你还需要知道一个与主 goroutine 有关的重要特性即一旦主goroutine 中的代码也就是main函数中的那些代码执行完毕当前的 Go 程序就会结束运行。 如果在 Go 程序结束的那一刻还有 goroutine 未得到运行机会那么它们就真的没有运行机会了它们中的代码也就不会被执行了。 严谨地讲Go 语言并不会去保证这些 goroutine 会以怎样的顺序运行。由于主goroutine 会与我们手动启用的其他 goroutine 一起接受调度又因为调度器很可能会在goroutine 中的代码只执行了一部分的时候暂停以让所有的 goroutine 有更公平的运行机会。 所以哪个 goroutine 先执行完、哪个 goroutine 后执行完往往是不可预知的除非我们使用了某种 Go 语言提供的方式进行了人为干预。然而在这段代码中我们并没有进行任何人为干预。 文章学习自郝林老师的《Go语言36讲》
http://www.ihoyoo.com/news/3673.html

相关文章:

  • 苏州园区一站式服务中心国内最新新闻10条
  • 怎么做网站讯息产品彩页模板
  • 做网站的图片大小是多少263云通信企业邮箱
  • 宁夏做网站的室内装修设计用什么软件制图
  • 百度新网站提交入口wordpress user_register
  • 网站运营和维护百度生成手机网站
  • 二手网站排名网站设计的公司运营接单
  • 推广型网站建设软件辅导班广告去哪个网站做
  • 专门做杂志的网站高唐做网站建设公司
  • 开发网站需要什么技术天河网站建设多少钱
  • 设计师用的素材网站唐山门户网站建设
  • 十大免费行情软件网站下载甘肃省seo关键词优化
  • 在原备案号下增加新网站竞价托管服务公司
  • 网站建设的进度安排和人员安排wordpress 织梦转换
  • 临沂市平邑县建设局网站页面模板怎么没有了
  • 千秋网络是家西安做网站的公司建设工程材料网站
  • 南京较好的网站制作公司江西小程序开发
  • 长沙建站费用网站域名怎么登陆
  • 网站开发方式的选择中国建筑网官网首页
  • seo外链建设长春建站优化
  • 网站meta标签怎么做徐州市小程序制作
  • 微网站 举例哪款地图可以看到实时街景
  • app和手机网站制作图片的软件推荐
  • 网站怎么做二维码链接地址wordpress树状文章
  • 高新区做网站网页制作软件培训
  • 做带字头像的网站wordpress获取所有标签页
  • 做国内学历公证的网站wordpress能做社交
  • 做微信封面的网站小吃培训
  • 广州网站外包肇庆正规网页设计培训试听
  • 专业网站有哪些平台全国工商企业信息查询系统