1. 因为协程并不天然地在线程间调度。python, javascript 和 c++ 都是手动调度,所以协程在哪个线程里面是确定的,可以直接在协程里面更新 GUI 控件。
2. 碰到阻塞的 IO 操作就重写一个呗。接下来看谁重写的代价比较低了。python gevent 的代价是最低的,正常只要 monkey patch 即可搞定。此外 c++ 还有 libgo 之类的方案也特别低,模拟 go 语言并且 fork system api 很方便。
3. go 语言我不知道,但 python 跑在虚拟机上面。greenlet 和 asyncio 的切换成本都特别低,低到只要一两条 python 字节码。你担心个啥性能?java 和 c# 也是跑在虚拟机上面,再怎么牛逼,也没法比 c++20 的协程切换强吧。
说到这个,不管你以前对汇编有多懂,c++ 有多么牛逼。但我在协程领域从汇编开始实现过一套协程库,如果你非在这个领域和我怼,能不能 show me you code,拿出一套更强的出来啊。
4. 不知道你想说啥。
5. 不在线程间非自动调度的协程没有这个问题。而 golang 模糊协程和线程之间的绑定,确实导致了一些高性能程序的问题。有得必有失。但 hang 啥的没听说,只要你用 channel,就不会有那个问题。
你问出第 1 和第 5 两个问题,说明你只懂一个语言的协程,对其它语言的不太懂。
【 在 leadu 的大作中提到: 】
: 标 题: Re: Go语言看着要完啊
: 发信站: 水木社区 (Sun May 28 12:28:11 2023), 站内
:
: 1.ui线程问题。比如有一个后台协程,在需要更新界面内容的情况下,如何回到ui线程?非ui线程直接操作ui会失败的。
:
: 2.协程敏感的api范围问题。io操作的范围非常广,并口串口usb蓝牙等等。就算是大类网络和文件,也有查询dns和查看文件信息这种,可以异步但大家一般用的都是同步版本的api.协程敏感的api设计对这些如何处理的?
:
: 3.性能问题。你不是正经的c++程序员出身的,所以很多c++或是传统程序员的习惯你不太清楚。
: 这些人每多一次内存访问都会追问的,因为这就意味着100个时钟周的消失。
: Green thread这种实现方式,和普通协程相比,有可能多加个几十条指令和多次内存访问,这些都是代价,当然也可以通过属性等手段去规避一些,我之前的性能问题问的是这个。
: 你上次用汇编在我这碰了一次壁之后,这次又开始用c++来了。如果你感兴趣,我可以告诉你,我在主力转向c#之前纯靠c++吃了9年的饭。我之前混过c++版,当时c++版活跃人物是rockcock,ctrlz,netmd等id。
: 不愿意提这些一个是会暴露年龄,另外一个是我尽量不用年资,只用纯技术去讨论问题。
: gpmn不讨论技术细节,直接上来说他有20年经验,是蛮油腻的
:
: 4.用户想添加新api,Green thread感知部分怎么做?
:
: 5.协程给并发问题增加了很多情况,比如某协程需要回到某线程去,而该线程被占用了,就hang了。多写点复杂代码应该能遇到各种情况的
:
:
:
: 【 在 hgoldfish 的大作中提到: 】
: : 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# 强。
: : ...................
:
: --
: ※ 修改:·leadu 于 May 28 12:31:04 2023 修改本文·[FROM: 123.116.219.*]
: ※ 来源:·水木社区
http://www.mysmth.net·[FROM: 123.116.219.*]
--
修改:leadu FROM 123.116.219.*
FROM 117.24.94.*