Golang:并发

作者: 与蟒唯舞 | 来源:发表于2018-01-18 16:10 被阅读31次
    并发性与并行性 - 技术观点

    比方说,我们正在实现一个 Web 浏览器。Web 浏览器有各种组件。其中两个是对页面进行渲染的渲染器和从互联网下载文件的下载器。让我们假设我们已经构建了浏览器的代码,使得每个组件都可以独立执行(这可能是使用了 Java 中的线程,也可能使用了 Golang 中的协程)。当我们的浏览器运行在单核 CPU 上时,CPU 将在浏览器的这两个组件之间进行上下文切换。它可能(使用下载模块)进行下载文件一段时间后,切换到渲染模块去渲染用户请求的 HTML 页面。这就是并发。并发处理是从不同的时间点开始,而它们的执行周期是重叠的。

    假设同样的浏览器运行在多核 CPU 上,文件下载模块和页面渲染模块可以同时运行在 CPU 的不同核上。这就是并行。

    并行性并不总是能够提升运行速度。这是因为并行运行的组件可能需要相互通信。例如,还是这个浏览器的例子,当文件下载完成时,应该使用弹出窗口来通知用户。而这种通信发生在负责下载的组件和负责渲染用户界面的组件之间。在并发系统中,这种通信的开销很低。而如果这两个组件并行地运行在 CPU 的不同核上,这种通信的开销却很大。

    对并发的支持

    Golang 原生支持并发。在 Golang 中,使用协程(Goroutine)和通道(channel)来处理并发。

    相关文章

      网友评论

        本文标题:Golang:并发

        本文链接:https://www.haomeiwen.com/subject/fhkwoxtx.html