Go语言与python并发(协程)的异同

go语言和python都是时下火热的语言,两者在各自领域有自己的优势。它们都支持并发,这里对此做相应比较和区分。

go语言:

go语言是原生支持并发,这个是天生骄傲的,go语言的并发和python一样都是依靠协程,协程相当于函数层面的相继顺序调用,是一种区别于线程的非抢占式的任务调度。
go语言的协程其实已经封装的很好了,直接用“go”关键字就能开启,定义完协程后,启动程序,go语言内部的调度器就会在执行带goroutine处很智能的执行协程部分代码,随后遇到耗时操作(io等操作)需要让渡处操控权时就让别的协程执行(定义了goroutine后,一定意义上来说,主线程也是一个协程)。
go语言的协程分配的很智能,会自动根据cpu核数,以及协程总量来讲协程分配至一定数量的线程上,这样来说,并发上千上万个协程是完全没问题的。也正是这样,go语言现在成为高并发领域(直播等)的首选语言。


python:

我个人很喜欢python的语法,很易懂、人性化,相比go语言来说,不会那么严格,当然严格有严格的好处,统一规范,在开发大型项目协同合作上面是很有优势的。
python是一个不断进步的语言,python起初对并发其实支持并不好,因为有gil这把锁的存在,多核情况下多线程其实是鸡肋(具体想了解gil相关知识,可以看我另一篇文章:Python中的GIL详解)。
随后python出现了协程,python的协程并没有像go语言一样智能调度,它是需要手动yield,将操作权yield给另一个函数,yield也可以接收值,可以产出值,有通信的作用。随后python3.3出现了yield from,yield from实现了协程调用方调用子生成器并与之通信。
python为了将语义变得更加明确,就引入了async和await关键词用于定义原生的协程,通过async 函数名这样的方式来声明这个函数是一个协程,通过await 函数名方式将操作权让渡出去,这个协程的调度完全是人为的操纵的。
现在的python其实更具野心的并发库是asyncio,asyncio的定义并发其实效果和go差不多,采用的是时间轮循加协程,asyncio通过get_event_loop方法初始化一个事件轮循,这相当于一个调度器一样,调用方将所有协程注册到循环里,开启循环执行主方法,协程就能依次执行,碰到io操作时候就将协程挂起,知道执行完io就等待事件轮循下一次调度。
其实python的知名框架tornado就是使用事件轮循加协程方式实现高并发,也是非常牛X的框架。


对比总结:

其实就并发而言我是比较喜欢go语言的,毕竟对使用者比较友好嘛,但是对语言来说,我喜欢Python没道理。

Last modification:November 26th, 2019 at 10:06 am
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment