首先协程是什么就不多做解释了,看到这里的同学,我想至少对协程已经有了理解。
创新互联公司专业为企业提供那曲网站建设、那曲做网站、那曲网站设计、那曲网站制作等企业网站建设、网页设计与制作、那曲企业网站模板建站服务,10余年那曲做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
现在很多phper转go开发,大部分都是冲着go的静态语言和协程去的,当然还有钱多。
但是php自己其实也有协程支持,那就是 swoole 了。
工作原因,有幸接触了一段时间swoole和go,希望对比下两者的区别。
首先,网上很多大神关于swoole和go的对比,有的还是比较详细的。
比如swoole官方就有一个对比swoole和go的文章: ;version=1compare=current
知乎大神文章:
感兴趣的话,可以 拜读一下。
文章基本是围绕,swoole是单进程协程切换,go是MGP模型切换。
swoole 的单进程模型 不能共享资源,没有线程并发问题,协程切换依赖io等等。
对比下来,基本都是go性能比较突出。
确实,go的性能比php高出不少,但同时也比php的学习和使用成本高很多。而且,目前go的开发框架大都是基于beego或者gin,说好用真实有点昧良心,相比之下基于swoole的hyperf、mix-php都是开箱即用,包含了大部分需要的功能,二开也成本不高。
总的来说,go的性能确实比php要高,但是使用成本也高出不少,同时由于静态语言天然的特性,比php这种弱类型语言在开发时的成本也要高出不少。
基于协程的框架,抗并发性能基本都没大问题,如果后端存储能撑得住,server端的并发基本不会有问题。
swoole直播案例
线程:
多线程是为了解决CPU利用率的问题,线程则是为了减少上下文切换时的开销,进程和线程在Linux中没有本质区别,最大的不同就是进程有自己独立的内存空间,而线程是共享内存空间。
在进程切换时需要转换内存地址空间,而线程切换没有这个动作,所以线程切换比进程切换代价要小得多。
协程:
想要简单,又要性能高,协程就可以达到我们的目的,它是用户视角的一种抽象,操作系统并没有这个概念,主要思想是在用户态实现调度算法,用少量线程完成大量任务的调度。
Goroutine是GO语言实现的协程,其特点是在语言层面就支持,使用起来十分方便,它的核心是MPG调度模型:M即内核线程;P即处理器,用来执行Goroutine,它维护了本地可运行队列;G即Goroutine,代码和数据结构;S及调度器,维护M和P的信息。
占用一小部分
如果是用于监听端口的fd就绪了,就建立连接创建一个新的fd,交给一个协程来负责,协程执行入口就指向业务处理函数入口,业务处理过程中
福哥答案2020-08-20:
1.golang的协程是基于gpm机制,是可以多核多线程的。Python的协程是eventloop模型(IO多路复用技术)实现,协程是严格的 1:N 关系,也就是一个线程对应了多个协程。虽然可以实现异步I/O,但是不能有效利用多核(GIL)。
2.golang用go func。python用import asyncio,async/await表达式。
评论
go的main方法理解为入口函数,程序只执行这一个函数。整个项目由这个函数调度使用。
所以你的协程没有被运行。
你将协程函数命名,在main函数中调用 go test()即可