go 的协程等别人来回答,我回答一下比较有把握的 python 协程吧,同时包含 gevent 和 asyncio 两种方案。gevent 抄 eventlet 两者 API 几乎一样不说。
1. 支持 UI,不才就是 eventlet-pyqt 的作者,而 asyncio qtinter 的作者 fanci 也在本站 python 版上混。
2. gevent 有 monkey patch 随便支持,在无感知的情况下现有程序直接转换成协程版本,适用对象是几乎所有纯 python 写的源代码,用了 c 写的比如 mysql 除外,但 pgsql 支持。而 asyncio 和 c# 一样,分阻塞和非阻塞两个版本。支持协程 API 有额外的工作,和 c# 一样。go 语言底层要求所有 IO 操作都是协程友好,所以类似于 gevent,比 asyncio 和 C# 强。
3. 协程性能当然更好,不然为啥用协程。
4. 添加 API 很简单。不论是 gevent 还是 asyncio 都暴露出事件循环,随便你添加 process, signal, serial com 等等阻塞操作的支持。我添加的是 pyqt 的支持。
5. 我前面有提到协程池和 asyncio gather 和 c# 一样的。没啥特别的。event/lock/condition/queue/gather/foreach/map/map_unordered 啥的该有都有。
6. gevent.Greenlet 有个 link() 函数就是协程级联操作。一个协程串着另外几个协程,或者用 gevent.Event 也是可以。
7. 没啥 hang,没听说谁用 gevent/asyncio 搞出 hang 出来。都是在虚拟机里面操作的,出错了 python 抛异常就了事了,二十年的时间早就把底层的 BUG 都解决得差不多了。
8. gevent.Greenlet 有个 get(),正经人会用 queue 类似于 go 的 chan 比较好看。
我猜 go 也差不多。虽然和 python, java, c#, javascript 这四个虚拟机语言有实现上的差别,但底层原理都是几十年前就发明出来的。谁又能比谁强呢。
我劝你自己实现从头写个编程语言,然后自己实现一套协程。你就知道协程这东西没啥稀奇的,大家都差不多。尤其是版上 c++ 程序员实在太多了,看懂 c++ 的 coroutine,其它语言的瞄两眼就都懂了。
【 在 leadu 的大作中提到: 】
: 标 题: Re: Go语言看着要完啊
: 发信站: 水木社区 (Sat May 27 21:59:54 2023), 站内
:
: @hgoldfish 我的理解,go的协程
: 1.不支持UI
: 2.只支持特殊处理过的有限几个api
: 3.和异步比性能未必好,有可能差一点点
: 4.无法自己简单添加新的api受益于协程
: 5.不支持并发,比如同时启动100个策略等待部分返回
: 6.不支持continuewith等,协程级联操作
: 7.新加api处理不慎,容易出现hang
: 8.返回值需要通信原语
:
: 有错么?
:
: 【 在 gondar 的大作中提到: 】
: : 所有的IO都是异步的吧,不过file io最后还是会block个thread。快慢不重要吧,写server不都是只关注吞吐量吗,已经在buffer里应该会直接返回,不过得看下go是怎么实现的,不过就算多切换几次goroutine对实际应用区别也不会很大。
: : UI不知道了,go就不是用来写UI的吧
:
: --
:
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 123.116.219.*]
--
修改:hgoldfish FROM 117.24.94.*
FROM 117.24.94.*