Golang 线程和协程的区别

Python012

Golang 线程和协程的区别,第1张

线程

线程是为了解决CPU利用率的问题,线程则是为了减少上下文切换时的开销,进程和线程在Linux中没有本质区别,最大的不同就是进程有自己独立的内存空间,而线程是共享内存空间。

在进程切换时需要转换内存地址空间,而线程切换没有这个动作,所以线程切换比进程切换代价要小得多。

协程:

想要简单,又要性能高,协程就可以达到我们的目的,它是用户视角的一种抽象,操作系统并没有这个概念,主要思想是在用户态实现调度算法,用少量线程完成大量任务的调度。

Goroutine是GO语言实现的协程,其特点是在语言层面就支持,使用起来十分方便,它的核心是MPG调度模型:M即内核线程P即处理器,用来执行Goroutine,它维护了本地可运行队列G即Goroutine,代码和数据结构S及调度器,维护M和P的信息。

福哥答案2020-08-20:

1.golang的协程是基于gpm机制,是可以多核多线程的。Python的协程是eventloop模型(IO多路复用技术)实现,协程是严格的 1:N 关系,也就是一个线程对应了多个协程。虽然可以实现异步I/O,但是不能有效利用多核(GIL)。

2.golang用go func。python用import asyncio,async/await表达式。

评论

首先协程是什么就不多做解释了,看到这里的同学,我想至少对协程已经有了理解。

现在很多phper转go开发,大部分都是冲着go的静态语言和协程去的,当然还有钱多。

但是php自己其实也有协程支持,那就是 swoole 了。

工作原因,有幸接触了一段时间swoole和go,希望对比下两者的区别。

首先,网上很多大神关于swoole和go的对比,有的还是比较详细的。

比如swoole官方就有一个对比swoole和go的文章: https://wiki.swoole.com/wiki/diff/?id=1018&version=1&compare=current

知乎大神文章: https://zhuanlan.zhihu.com/p/93141701

感兴趣的话,可以 拜读一下。

文章基本是围绕,swoole是单进程协程切换,go是MGP模型切换。

swoole 的单进程模型 不能共享资源,没有线程并发问题,协程切换依赖io等等。

对比下来,基本都是go性能比较突出。

确实,go的性能比php高出不少,但同时也比php的学习和使用成本高很多。而且,目前go的开发框架大都是基于beego或者gin,说好用真实有点昧良心,相比之下基于swoole的hyperf、mix-php都是开箱即用,包含了大部分需要的功能,二开也成本不高。

总的来说,go的性能确实比php要高,但是使用成本也高出不少,同时由于静态语言天然的特性,比php这种弱类型语言在开发时的成本也要高出不少。

基于协程的框架,抗并发性能基本都没大问题,如果后端存储能撑得住,server端的并发基本不会有问题。

swoole直播案例