栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

coroutine(python)和goroutine(go)的区别

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

coroutine(python)和goroutine(go)的区别

python协程的特点

单线程内切换,适用于IO密集型程序中,可以最大化IO多路复用的效果。

无法利用多核。

协程间完全同步,不会并行。不需要考虑数据安全。

用法多样,可以用在web服务中,也可用在pipeline数据/任务消费中

Go协程的特点

协程间需要保证数据安全,比如通过channel或锁。

可以利用多核并行执行。

协程间不完全同步,可以并行运行,具体要看channel的设计。

抢占式调度,可能无法实现公平。

coroutine(python)和goroutine(go)的区别

除了python,C#, Lua语言都支持 coroutine 特性。coroutine 与 goroutine 在名字上类似,都是可中断可恢复的协程,它们之间最大的不同是,goroutine 可能在多核上发生并行执行,单但 coroutine 始终是顺序执行。也基于此,我们应该清楚coroutine适用于IO密集程序中,而goroutine在 IO密集和CPU密集中都有很好的表现。不过话说回来,go就一定比python快么,假如在完全IO并发密集的程序中,python的表现反而更好,因为单线程内的协程切换效率更高。

从运行机制上来说,coroutine 的运行机制属于协作式任务处理, 程序需要主动交出控制权,宿主才能获得控制权并将控制权交给其他 coroutine。如果开发者无意间或者故意让应用程序长时间占用 CPU,操作系统也无能为力,表现出来的效果就是计算机很容易失去响应或者死机。goroutine 属于抢占式任务处理,已经和现有的多线程和多进程任务处理非常类似, 虽然无法控制自己获取高优先度支持。但如果发现一个应用程序长时间大量地占用 CPU,那么用户有权终止这个任务。

从协程:线程的对应方式来看:

N:1,Python协程模式,多个协程在一个线程中切换。在IO密集时切换效率高,但没有用到多核

1:1,Java多线程模式,每个协程只在一个线程中运行,这样协程和线程没区别,虽然用了多核,但是线程切换开销大。

N:M,go模式,多个协程在多个线程上切换,既可以用到多核,又可以减少切换开销。(当都是cpu密集时,在多核上切换好,当都是io密集时,在单核上切换好)。

作者:屈天航

原链接:https://segmentfault.com/a/1190000038241863

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/324338.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号