@
shermie #47
我搜了下,PHP 也有协程,所以我猜你是指 PHP 协程?
如果是这样,那我补充一点,除了 erlang 、golang ,多年前 lua 或者 c/cpp 也早就有协程或者库,但都是手动挡,比如 lua 的 yield resume ,我刚才搜的帖子里 PHP 的方式也是需要手动 yield 。
近几年 js py 之类的也搞了 async await 这些。确实,整体看上去是同步代码、顺序可读了。但是,这种手动挡理解起来并不直观,对于步骤层次不多的,个人觉得手动挡协程甚至不如 callback 。
nodejs 还有 Promise 这种,看上去是那个顺序,但并发的时序可能不是那个顺序,很多人因为这个写 bug 、或者理解吃力、或者要自己控制时序时非常麻烦。
很多人可能没有深度使用 erlang 、golang 协程,或者已经习惯了那些手动挡的蹩脚协程,所以 get 不到 erlang 、golang 这种像线程一样的并发有多爽。
Java 的虚拟线程还是啥也是类似协程,但似乎只是解决了语言指令级的调度,系统调用等行为并不会主动出让并可能因为阻塞占用了线程,我没有深入研究、不知道是否理解有误,但好像 Java 至少仍然需要解决大量的底层接口与虚拟线程调度结合的问题,这仍然需要很大的改造。
再补充一些,现实业务不只是 CURD ,PHP 的编程姿势主要是为 Web 服务,一旦有复杂的需求,用 PHP 实现起来会很蹩脚、或者浪费资源,比如游戏
#2 > php 很多业务场景 go 开发起来是无法胜任的
所以我觉得,你这个可能把现象搞错了。现象是 PHP 有众多轮子,并且未必需要高性能或者什么,用 go 去重新做成本收益不划算。就像好些人说企业级只能 Java 一样,其实不是 golang 或者其他不能搞,而是因为 Java 已经形成了成熟的产业链和社区,并且企业级的业务 Java 性能各方面也足够胜任。用 golang 或者其他语言去重造需要很长时间,而现实商业场景,没哪家资本愿意去推动这个。但如果是新团队重新造这些,是可以用 golang 的。字节系大量业务用 golang ,飞书应该也用得挺多的,人家有钱有资源有人才,就是可以搞。
除了极度性能场景是 c/cpp/rust 的天下,或者特殊专用领域,绝大部分的通用领域、绝大部分高并发高性能场景,golang 能搞、PHP 却未必能胜任。