Go 语言并发编程(一):并发的演化历史

栏目: Go · 发布时间: 6年前

内容简介:根据2018年09月16日武汉·光谷猫友会,武汉的Gopher小伙伴分享的Go并发编程整理的内容。本次分享的主题内容包含Go语言并发哲学,并发的演化历史,你好并发,并发的内存模型,常见的并发模式等内容。关于并发编程的补充内容可以参考《Go语言高级编程》第一章的相关内容。本次整理并发的演化历史部分的内容。不要通过共享内存来通信, 而是通过通信来共享内存!

根据2018年09月16日武汉·光谷猫友会,武汉的Gopher小伙伴分享的 Go 并发编程整理的内容。本次分享的主题内容包含Go语言并发哲学,并发的演化历史,你好并发,并发的内存模型,常见的并发模式等内容。关于并发编程的补充内容可以参考《Go语言高级编程》第一章的相关内容。

本次整理并发的演化历史部分的内容。

Go语言并发哲学

Do not communicate by sharing memory, instead, share memory by communicating!
 

不要通过共享内存来通信, 而是通过通信来共享内存!

不要逆行!

并发的演化历史

Go语言最早从UNIX系统的B语言和 C语言 演化而来,其中的并发特性是从Newsqueak、Alef和Limbo等语言演化而来。其中Newsqueak是Go之父Rob Pike于989年设计的语言,Alef则是Phil Winterbottom于1993年对C语言扩展了并发特性的语言,Limbo也是Rob Pike参与设计的支持并发的语言。由此可见,Rob Pike在并发编程语言领域已经积累了几十年的设计经验,Go语言正是站在这些前辈的基础上涅槃重生的。

Go语言并发的理论基础是来自Hoare于1978年发表的CSP论文(Hoare就是发明快速 排序 的大牛)。更通俗的类比,CSP对应的编程模型和UNIX中的管道非常相似,而管道更是在1964年就已经发明了。因此,从理论上看,Go语言的并发并非什么新发明的特性,它只不过是将CSP代表的通过消息同步的编程模型带入了工业开发领域。

Newsqueak素数筛 - Rob Pike, 1989

先看看素数筛的原理图:

Go 语言并发编程(一):并发的演化历史

然后是Newsqueak素数筛代码:

<code>counter := prog(c:chan of int) {
    i:=2;
    for(;;)
        c <-= i++;
};

filter := prog(prime:int, listen, send:chan of int) {
    i:int;
    for(;;)
        if((i = <-listen)%prime)
            send <-= i;
};

sieve := prog() of chan of int {
    c := mk(chan of int);
    begin counter(c);
    prime := mk(chan of int);
    begin prog(){
        p:int;
        newc:chan of int;
        for(;;){
            prime <-= p =<- c;
            newc = mk();
            begin filter(p, c, newc);
            c = newc;
        }
    }();
    become prime;
};

prime:=sieve();</code>

其中begin关键字启动一个并发,类似Go语言的go关键字。而become关键字表示返回值,类似return语句。因此说Newsqueak和Go语言的并发有很多相似之处。

Alef - Phil Winterbottom, 1993

然后是Alef语言。据说这个语言是C语言之父Ritchie所钟爱的语言。不过Alef只是短暂地出现在Plan9系统中。目前传世的官方文档只有入门指南和参考手册。

下面的代码是Alef文档中摘取的片段:

<code>#include <alef.h>

void receive(chan(byte*) c) {
    byte *s;
    s = <- c;
    print("%s\n", s);
    terminate(nil);
}

void main(void) {
    chan(byte*) c;
    alloc c;
    proc receive(c);
    task receive(c);
    c <- = "hello proc or task";
    c <- = "hello proc or task";
    print("done\n");
    terminate(nil);
}</code>

可以将Alef看作是类似C++的语言,基础的语法完善和C语言保存一致,但是在并发编程方向做了扩展。其中proc是启动一个进程,task是启动一个线程。

因为C语言没有GC特性,因此Alef并发所创建或分享的资源管理将会是一个极大的调整。并发的语法虽然看着很美,但是进行真正的并发编程可能没有那么容易。

Alef产生的并发体可能异常复杂,下图是Alef文档中摘取的图片:

Go 语言并发编程(一):并发的演化历史

总共有6个线程分布在3个进程中,现场并发体相互之间通过管道进行通信。因为Alef同时支持进程和线程,可以说它其实是伪装成编程语言的操作系统!

其它内容待续

在线浏览幻灯片:

https://talks.godoc.org/github.com/chai2010/awesome-go-zh/chai2010/chai2010-golang-concurrency.slide

幻灯片源文件:

https://github.com/chai2010/awesome-go-zh/tree/master/chai2010

Go 语言并发编程(一):并发的演化历史


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Head First Mobile Web

Head First Mobile Web

Lyza Danger Gardner、Jason Grigsby / O'Reilly Media / 2011-12 / $ 50.84

Despite the huge number of mobile devices and apps in use today, your business still needs a website. You just need it to be mobile. Head First Mobile Web walks you through the process of making a con......一起来看看 《Head First Mobile Web》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具