go语言并发 goroutine 线程 管道模型 channel 实现进程间通信 这个参考 *** 作系统里的内容,当时还有一堆其他的比如共享内存,内存映射等方法,后面的设计肯定涉及到一堆边界和权限的问题,管道应该是linux里面比较简单的一个通信设计了。可以对比一下C++,如果要把几个函数装到线程里,需要调用thread,然后显式.join,再是thread之间通信,同步就很多要写。go线程是在多CPU中并行有自己的优化,相当于直接对多CPU抽象,好像C++中的thread库只能是一个CPU上使用的线程异步。和 *** 作系统一样,线程上除了同步,竞争资源,还要考虑进程间通信。在C的编程中,要访问共享的资源,那肯定就是锁、信号量的组合,然后结合比如说管程等各种模型进行显式管理。go里面怎么感觉差不多啊,也要那么多机制?晕,我还以为有什么可以简化的。channel?非服务器相关从业者,也不做以太坊编程,就大致看了下教程。
整体上看到了很多语言的影子,C C++ Java python matlab
我还在想为啥类型后置,好别扭啊,java里数组的[]后置,结果go里都是后置,不太习惯。
不过还是那句话,如果学习一门语音只是为了换种语法刷leecode,那真的是太闲了。所以就粗略的了解下go的变量、控制和函数,然后花更多的时间去看go在服务器编程上的实例和设计优势。
没有类和继承,有结构体和接口,其实有点像那种奇异值矩阵,降维压缩,压到最少的维数,这边接口最完美的情况就是用最少的独立接口组合覆盖所有需要的类。
主要是看go里的并发和反射
package main
import (
"fmt"
"runtime"
"sync"
)
var counter int = 0
func Count(lock *sync.Mutex) {
lock.Lock()
counter++
fmt.Println(counter)
lock.Unlock()
}
func main() {
lock := &sync.Mutex{}
for i := 0; i < 10; i++ {
go Count(lock)
}
for {
lock.Lock()
c := counter
lock.Unlock()
runtime.Gosched()
if c >= 10 {
break
}
}
}
并发可看成逻辑多个处理器,并行是真的多个处理器同时执行一些任务go推荐使用channel完成通信而非共享内存go看下来最重要的还是能够很方便通过go 切分成多个线程,然后自动并行去执行。对比一下C++,需要使用额外的库。还是粗略的看了一下,如果之后再用到再仔细看。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)