- 主题:用协程不如用go和rust
【 在 hgoldfish 的大作中提到: 】
: c++20 里面会把 co_yield 转换成真正的调度代码啊。
: 转换成 c/asm 代码,co_yield 就是个 return 语句。也就是返回它的调用者。
: 而调用者用 co_await 切换到 generator 刚才退出的位置继续执行。
: ...................
多线程协程就得有调度器呀,没想出来怎么使用别的线程的协程。
就如你的数据库洗数据的例子,如果一个协程在一个线程里,一个在另一个线程里,显然,二者就有了并行性,性能就会有优势。
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
【 在 hgoldfish 的大作中提到: 】
: 你思维一直没跳出来。。
: 你考虑一个问题啊。假如。你在是内核里面实现协程调度呢?
: epoll() 这些都没有了。也没有 ucontext 帮我搞啥协程切换。
: ...................
内核调度,就是线程/进程呀,你说的所有异步过程发生在内核,在IO时,肯定会锁死线程/进程,但是别的线程/进程不受影响,在用户态,看起来就是同步IO。
在所有的例子里,协程就是语法糖,就如你说的,性能另说,它不是关键的,必不可少的技术方法。
如果把协程的context封装了,那跟线程又有什么区别呢?你的那些例子用多线程干可能更好。
12楼的例子,就是要在IO时挂起一个协程,而不挂起线程,线程可以为其他协程服务(特别是单线程协程),实现用户级的异步IO,那么必须开放context,不然,挂起谁呢?
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
对啊。协程有时候和线程相比就是模糊不清的。
一个线程,在内核空间时碰到 IO 就主动 yield 的纤程,在用户空间时又是因为陷入内核态被调度器切换走的线程。
我们完全可以把 syscall 这条指令看成是纤程的 co_yield
这就是为啥我越来越觉得协程 coroutine 应该作为一种高层抽象,而不是具体的底层实现技术。具体的底层实现技术我觉得巨硬之前取的名字挺好的,就叫做 fiber,指代在一个线程里面切换的协程。
你实现的协程,是一种在多个线程之间切换的协程,应该叫做绿线程 green thread. 现在 java 改做 virtual thread 了。
【 在 ylh1969 的大作中提到: 】
: 内核调度,就是线程/进程呀,你说的所有异步过程发生在内核,在IO时,肯定会锁死线程/进程,但是别的线程/进程不受影响,在用户态,看起来就是同步IO。
: 在所有的例子里,协程就是语法糖,就如你说的,性能另说,它不是关键的,必不可少的技术方法。
: 如果把协程的context封装了,那跟线程又有什么区别呢?你的那些例子用多线程干可能更好。
: ...................
--
修改:hgoldfish FROM 117.28.163.*
FROM 117.28.163.*
我是用C的协程,解决同步IO异步化的问题。
原先用回调函数,太繁琐,很难推行到业务逻辑层。人家关心业务,如12楼,对同步异步不感兴趣,也懒得弄。
C++的协程,还不知道怎么和epoll结合解决12楼的问题。
26楼有yield的方案,但是在C++的协程,不知道要把啥东西交给epoll,context被封装了。
如13楼
std::generator<int> generate_numbers(int start, int end) {
for (int i = start; i <= end; ++i) {
do_epoll(context,0,flg);// put context to epoll
co_yield SUSPEND; // 请线程去epoll_wait()等结果。
【 在 munaiyi 的大作中提到: 】
: 是的,但是用c++协程不如用异步方式也许更好。
:
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
要解决12楼问题,只有协程。
对协程系统的要求,必须提供context。
对事件系统的要求,必须能够绑定context。
最好支持多线程,能够各个线程独立的随时的,立即生效的,加入,删除,等待事件队列。
协程本来与线程无关,但是,要想真正实现多线程,就必须有调度,要想调度,就得有context。
【 在 hgoldfish 的大作中提到: 】
: 对啊。协程有时候和线程相比就是模糊不清的。
: 一个线程,在内核空间时碰到 IO 就主动 yield 的纤程,在用户空间时又是因为陷入内核态被调度器切换走的线程。
: 我们完全可以把 syscall 这条指令看成是纤程的 co_yield
: ...................
--
修改:ylh1969 FROM 221.218.60.*
FROM 221.218.60.*
c#是搞gui的?不对吧
现在c#做企业后台开发,和做游戏开发都有用啊
【 在 hgoldfish 的大作中提到: 】
: 谁想用 c++ 呢。问题是很多领域,就只有 c++ 可用。
: 既然又要语言大战,我就扯淡一下。大多数语言 c/c++, java 以及一众脚本语言比如 python, perl, ruby, go 从来没有把自己定位成某个领域专用语言。所以有个好处是不会太限制程序员的上限。
: 反之,c#, js, lua 和 rust 在设计的时候都有明确的定位。rust 要搞系统编程。c# 和 js 是搞 GUI 的。这一类语言程序员少碰为妙。
: ...................
--
FROM 223.104.78.*
广义上的 web 后端和游戏开发也是 UI
注意我这里提的是 UI,不是 GUI
像 c++ 就不能说是 UI 语言,因为它可以拿来搞算法和系统编程。不需要考虑用户交互。
【 在 zerg136 的大作中提到: 】
: c#是搞gui的?不对吧
: 现在c#做企业后台开发,和做游戏开发都有用啊
--
FROM 27.152.110.*