go并发临时

GO并发
使用goroutine运行程序,检测并修正状态,利用通道共享数据。
通常程序会被编写为一个顺序执行并完成一个独立任务的代码。
web服务器需要在各自独立的套接字(Socket)上通过接受多个数据请求。
每个套接字请求是独立的,独立于其他套接字进行处理。并行执行多个请求的能力可显著提高这类系统的性能。
Go语言中的并发指的是能让某个函数独立于其他函数运行的能力。当一个函数创建为goroutine时,Go会将其视为一个独立的工作单元。这个单元会被调度到可用的逻辑处理器上执行。
Go语言运行时的调度器,管理创建的所有goroutine并为其分配执行时间。
这个调度器在操作系统之上,将操作系统的线程与语言运行时的逻辑处理器绑定,并在逻辑处理器上运行
goroutine。调度器在任何给定的时间,都会全面控制哪个goroutine 要在哪个逻辑处理器上运行。
Go语言的并发同步模型来自一个叫作通信顺序进程(Communicating Sequential Processes,CSP)
的范型(paradigm)。CSP 是一种消息传递模型,通过在goroutine 之间传递数据来传递消息,而不是
对数据进行加锁来实现同步访问。用于在goroutine 之间同步和传递数据的关键数据类型叫作通道
(channel)。
使用通道可以使编写并发程序更容易,也能够让并发程序出错更少。

什么是操作系统的线程(thread)和进程(process)
便于理解Go语言运行时调度器如何利用操作系统来并发运行goroutine。
当运行一个应用程序的时候,操作系统会为这个应用程序启动一个进程。可以将这个进程看作一个包含了应用程序在运行中需要用到和维护的各种资源的容器。
一个线程是一个执行空间,这个空间会被操作系统调度来运行函数中所写的代码。
每个进程至少包含一个线程,每个进程的初始线程被称作主线程。
因为执行这个线程的空间是应用程序的本身的空间,所以当主线程终止时,应用程序也会终止。
操作系统将线程调度到某个处理器上运行,这个处理器并不一定是进程所在的处理器。
不同操作系统使用的线程调度算法一般都不一样,但是这种不同会被操作系统屏蔽,并不会展示给程序员。
进程维护了应用程序运行时的内存地址空间、文件和设备的句柄以及线程。操作系统的调度器决定哪个线程会获得给定的CPU的运行时间。

操作系统会在物理处理器上调度线程来运行,而Go 语言的运行时会在逻辑处理器上调度goroutine来运行。
每个逻辑处理器都分别绑定到单个操作系统线程。操作系统线程、逻辑处理器和本地运行队列之间的关系。
如果创建一个goroutine 并准备运行,这个goroutine 就会被放到调度器的全局运行队列中。之后,调度器就
将这些队列中的goroutine 分配给一个逻辑处理器,并放到这个逻辑处理器对应的本地运行队列上,Go语言的
运行时默认会为每个可用的物理处理器分配一个逻辑处理器。
本地运行队列中的goroutine会一直等待直到自己被分配的逻辑处理器执行。
go调度器如何管理goroutine:
Go语言运行时会把goroutine调度到逻辑处理器上运行。这个逻辑处理器绑定到唯一的操作系统线程。当goroutine可以运行的时候,会被放入逻辑处理器的执行队列中。
当goroutine执行了一个阻塞的系统调用时,调度器会将这个线程与处理器分类,并创建一个新线程来运行这个处理器上提供的服务。

有时,正在运行的goroutine 需要执行一个阻塞的系统调用,如打开一个文件。当这类调用
发生时,线程和goroutine 会从逻辑处理器上分离,该线程会继续阻塞,等待系统调用的返回。
与此同时,这个逻辑处理器就失去了用来运行的线程。所以,调度器会创建一个新线程,并将其
绑定到该逻辑处理器上。之后,调度器会从本地运行队列里选择另一个goroutine 来运行。一旦
被阻塞的系统调用执行完成并返回,对应的goroutine 会放回到本地运行队列,而之前的线程会
保存好,以便之后可以继续使用。
如果一个 goroutine 需要做一个网络I/O 调用,流程上会有些不一样。在这种情况下,goroutine
会和逻辑处理器分离,并移到集成了网络轮询器的运行时。一旦该轮询器指示某个网络读或者写
操作已经就绪,对应的goroutine 就会重新分配到逻辑处理器上来完成操作。调度器对可以创建
的逻辑处理器的数量没有限制,但语言运行时默认限制每个程序最多创建10 000 个线程。这个
限制值可以通过调用runtime/debug 包的SetMaxThreads 方法来更改。如果程序试图使用
更多的线程,就会崩溃。
并发(concurrency)不是并行(parallelism)。并行是让不同的代码片段同时在不同的物理处
理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做
了一半就被暂停去做别的事情了。在很多情况下,并发的效果比并行好,因为操作系统和硬件的
总资源一般很少,但能支持系统同时做很多事情。这种“使用较少的资源做更多的事情”的哲学,
也是指导Go 语言设计的哲学。
如果希望让goroutine 并行,必须使用多于一个逻辑处理器。当有多个逻辑处理器时,调度器
会将goroutine 平等分配到每个逻辑处理器上。这会让goroutine 在不同的线程上运行。不过要想真
的实现并行的效果,用户需要让自己的程序运行在有多个物理处理器的机器上。否则,哪怕Go 语
言运行时使用多个线程,goroutine 依然会在同一个物理处理器上并发运行,达不到并行的效果。
在一个逻辑处理器上并发运行goroutine 和在两个逻辑处理器上并行运行两个并
发的goroutine 之间的区别。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • 正文开始之前先抛出一个思考:让一个静态网站满足海量用户访问本质上是一个并行问题还是并发问题? 并发的世界 并发这个...
    谢培阳阅读 1,961评论 3 16
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • Goroutine是Go里的一种轻量级线程——协程。相对线程,协程的优势就在于它非常轻量级,进行上下文切换的代价非...
    witchiman阅读 4,787评论 0 9
  • 1、How to show the SQLite via Core Data: If you are curiou...
    walter0817阅读 233评论 0 0
  • 亲爱的10年后的自己,你还好吗? 在这样一个寒冷的冬日夜晚,四周静谧,我在读书,取暖器的暖光让冰冷的书房多了些许柔...
    安尘lee阅读 492评论 1 0