m*****n 发帖数: 3575 | 1 coroutine 和 functional programming
google算是把coroutine给整明白了,python却在全局单核锁的条件下把coroutine弄得
非常繁琐。好像Java也绷不住了,也上了coroutine. 新版的C++是不是也上了?
要我说python这种连起双核都很难的语言,老老实实学Qt玩signal slot就得了,整个
屁的coroutine脱了裤子放屁。
第二大烂坑是functional programming,其实就是去对象化。这里面最激进的是golang
,到现在我也不明白为什么要彻底去除class和methods. 谁知道原因? |
h****e 发帖数: 2125 | 2
golang
【在 m*****n 的大作中提到】 : coroutine 和 functional programming : google算是把coroutine给整明白了,python却在全局单核锁的条件下把coroutine弄得 : 非常繁琐。好像Java也绷不住了,也上了coroutine. 新版的C++是不是也上了? : 要我说python这种连起双核都很难的语言,老老实实学Qt玩signal slot就得了,整个 : 屁的coroutine脱了裤子放屁。 : 第二大烂坑是functional programming,其实就是去对象化。这里面最激进的是golang : ,到现在我也不明白为什么要彻底去除class和methods. 谁知道原因?
|
d*******r 发帖数: 3299 | 3 OOP原教旨: 尽量只用名词来描述世界
FP原教旨: 尽量只用动词来描述世界
动词名词自然使用的人类: 上面都是神经病 |
c******n 发帖数: 16666 | |
N***e 发帖数: 61 | 5 真是不能同意再多。
【在 d*******r 的大作中提到】 : OOP原教旨: 尽量只用名词来描述世界 : FP原教旨: 尽量只用动词来描述世界 : 动词名词自然使用的人类: 上面都是神经病
|
m*****n 发帖数: 3575 | 6 go明确表示不支持class.
其它很多写法是C++的变种
C++ 减class 减thread 加coroutine 约等于go
【在 c******n 的大作中提到】 : 我是进来看fp的 : 结果看到了说go是fp
|
w***g 发帖数: 5958 | 7 同意。比如python的generator,也是一种coroutine,但是用起来
非常舒服。更加一般的coroutine,我还没能体会到秒处。
class非常重要,没有class根本活不了。go那套东西根本就不是
广义的coroutine。那说goroutine是coroutine,那C的所有函数
也都是没有yield的coroutine。从语言上来说,goroutine就是
标准的线程。
C++动作慢,最后连yield都因为兼容性不能进入关键字了,搞个
什么co_yield, 一点都不漂亮。钱多了拔苗助长,百年基业怕是
要毁于一旦。
golang
【在 m*****n 的大作中提到】 : coroutine 和 functional programming : google算是把coroutine给整明白了,python却在全局单核锁的条件下把coroutine弄得 : 非常繁琐。好像Java也绷不住了,也上了coroutine. 新版的C++是不是也上了? : 要我说python这种连起双核都很难的语言,老老实实学Qt玩signal slot就得了,整个 : 屁的coroutine脱了裤子放屁。 : 第二大烂坑是functional programming,其实就是去对象化。这里面最激进的是golang : ,到现在我也不明白为什么要彻底去除class和methods. 谁知道原因?
|
w***g 发帖数: 5958 | 8 goroutine不能yield,不是coroutine。
coroutine是deterministic的,控制权在两个协程之间交换。
goroutine是带cooperative scheduling的threading,
goroutine的yield是yield到scheduler里的,
其实就是windows 98,逆历史潮流而动。windows 98
如果该yield的地方没有yield就会导致操统挂死。
windows98是coroutine吗?
不过纠结这些屁用没有,他们要写go,就让他们写go去,
老子反正不参与。 年轻人里也有脑子明白的,C++标准
研究的透透的,不用怕将来没有人写程序。
go就是比特币,说不明白。过10年再看。这两年深感
世人的糊涂和不可救药。
【在 m*****n 的大作中提到】 : go明确表示不支持class. : 其它很多写法是C++的变种 : C++ 减class 减thread 加coroutine 约等于go
|
m*****n 发帖数: 3575 | 9 go的妙处是可以静等,不用动等一个全局变量变动
很多线程是要自旋动等某个全局变量变动的——这点不如goroutine,直接来个channel
阻塞。这点是最好的。也就是说goroutine的优点是再也不用while true, sleep, if
break大法。
而python根本没有这个,最多用的是await,表面上说是另一个函数相当于起了个协程
,我等它做完,其实不就是调用一个函数么?所以我说脱了裤子放屁。
【在 w***g 的大作中提到】 : goroutine不能yield,不是coroutine。 : coroutine是deterministic的,控制权在两个协程之间交换。 : goroutine是带cooperative scheduling的threading, : goroutine的yield是yield到scheduler里的, : 其实就是windows 98,逆历史潮流而动。windows 98 : 如果该yield的地方没有yield就会导致操统挂死。 : windows98是coroutine吗? : 不过纠结这些屁用没有,他们要写go,就让他们写go去, : 老子反正不参与。 年轻人里也有脑子明白的,C++标准 : 研究的透透的,不用怕将来没有人写程序。
|
w***g 发帖数: 5958 | 10 不过消息队列是一个比coroutine更加广泛的技术。
coroutine能做的多线程加消息队列也都能做。
而coroutine没法做multi-producer multi-consumer。
这个也许是为什么过去几十年主流语言一直没有
coroutine。
【在 w***g 的大作中提到】 : goroutine不能yield,不是coroutine。 : coroutine是deterministic的,控制权在两个协程之间交换。 : goroutine是带cooperative scheduling的threading, : goroutine的yield是yield到scheduler里的, : 其实就是windows 98,逆历史潮流而动。windows 98 : 如果该yield的地方没有yield就会导致操统挂死。 : windows98是coroutine吗? : 不过纠结这些屁用没有,他们要写go,就让他们写go去, : 老子反正不参与。 年轻人里也有脑子明白的,C++标准 : 研究的透透的,不用怕将来没有人写程序。
|
n******t 发帖数: 4406 | 11 golang這種帶了把進程調度弄進runtime的,只能寫某些很固定panttern的程序。如果
機器上有一堆程序都是go寫得,肯定behaviour亂七八糟,沒準星的。不過golang的
tooling是強項這個還是要承認的。
coroutine是個很老的東西,不知道這幾年爲啥炒這麼熱。大部分程序都不用增加併發
度,而不用增加併發度去用coroutine是會讓程序變慢的,很多人這種基本的道理都不
知道。
【在 w***g 的大作中提到】 : goroutine不能yield,不是coroutine。 : coroutine是deterministic的,控制权在两个协程之间交换。 : goroutine是带cooperative scheduling的threading, : goroutine的yield是yield到scheduler里的, : 其实就是windows 98,逆历史潮流而动。windows 98 : 如果该yield的地方没有yield就会导致操统挂死。 : windows98是coroutine吗? : 不过纠结这些屁用没有,他们要写go,就让他们写go去, : 老子反正不参与。 年轻人里也有脑子明白的,C++标准 : 研究的透透的,不用怕将来没有人写程序。
|
w***g 发帖数: 5958 | 12 python就是地性能的代名词,且不说根本就搞不定,就是搞定了,
别的地方也一样慢。python要性能的地方直接接入C++就完了。
channel
【在 m*****n 的大作中提到】 : go的妙处是可以静等,不用动等一个全局变量变动 : 很多线程是要自旋动等某个全局变量变动的——这点不如goroutine,直接来个channel : 阻塞。这点是最好的。也就是说goroutine的优点是再也不用while true, sleep, if : break大法。 : 而python根本没有这个,最多用的是await,表面上说是另一个函数相当于起了个协程 : ,我等它做完,其实不就是调用一个函数么?所以我说脱了裤子放屁。
|
g****t 发帖数: 31659 | 13 My two cents:
主流语言例如C这样的,没有coroutine 是因为其function的概念(或者call , return
的概念)与stack
绑定在一起。一个函数一个frame ,互不侵犯。
此stack之概念又与硬件深度绑定。例如stack memory之虚拟地址转换成物理地址,要
用到特殊
设计的寄存器与cache,查表等东西。
(我认为)不考虑硬件之配合与设计。任何一本is 书上那些启发式寻地址或者调度之类
的算法都是似是而非,甚至不合理,不成立的。
假设我们有一种特殊的函数。
F1(special_arg, arg1,arg2...) 允许指定一个special_arg(以及return)不放在函数
自己分配的stack里,而是可以放在与另一函数F2皆可访问的一个地址里。问题就解决
了。
但是此种设计之内存寻址什么的,必定要改硬件。不然速度上不去。最基本的,内存
miss之类的
代价是不可承受的。所以此類東西只弄個語法實現沒什麼意義。
所以楼主所说之functional, coroutine 之
等问题的根源,是在于silicon对stack frame之支持。由此你无法有性能的实现对函数
的call,
return的不同理解。
In one word,function, stack, etc不是硬件无关的概念。这点我认为教科书是强调
的不够的。
: 不过消息队列是一个比coroutine更加广泛的技术。
: coroutine能做的多线程加消息队列也都能做。
: 而coroutine没法做multi-producer multi-consumer。
: 这个也许是为什么过去几十年主流语言一直没有
: coroutine。
【在 w***g 的大作中提到】 : python就是地性能的代名词,且不说根本就搞不定,就是搞定了, : 别的地方也一样慢。python要性能的地方直接接入C++就完了。 : : channel
|
g****t 发帖数: 31659 | 14 Goroutine算是线程同级别的调度单位吧。
Core-process-thread
Core-process-goroutine
goroutine 之语法与Thread 不同。
逻辑层在同一层。
: 同意。比如python的generator,也是一种coroutine,但是用起来
: 非常舒服。更加一般的coroutine,我还没能体会到秒处。
: class非常重要,没有class根本活不了。go那套东西根本就不是
: 广义的coroutine。那说goroutine是coroutine,那C的所有函数
: 也都是没有yield的coroutine。从语言上来说,goroutine就是
: 标准的线程。
: C 动作慢,最后连yield都因为兼容性不能进入关键字了,搞个
: 什么co_yield, 一点都不漂亮。钱多了拔苗助长,百年基业怕是
: 要毁于一旦。
: golang
【在 w***g 的大作中提到】 : python就是地性能的代名词,且不说根本就搞不定,就是搞定了, : 别的地方也一样慢。python要性能的地方直接接入C++就完了。 : : channel
|
g****t 发帖数: 31659 | 15 Python应该用于把不同的东西粘贴在一起。其他用法本質上似乎都是一些hack。可靠性
是个谜。
: python就是地性能的代名词,且不说根本就搞不定,就是搞定了,
: 别的地方也一样慢。python要性能的地方直接接入C 就完了。
: channel
【在 w***g 的大作中提到】 : python就是地性能的代名词,且不说根本就搞不定,就是搞定了, : 别的地方也一样慢。python要性能的地方直接接入C++就完了。 : : channel
|
m**u 发帖数: 541 | 16 C++ 实际是学院派, 从定义出发,然后就是应用。 基本是数学的演绎。
其它的玩意,都是打野球拳。
这好比学校里,老老实实搞定义的,都比较难, 大部分人是套题的。
走定义的好学生少,大部分都是套题。
这个够清晰了把? |
h**********c 发帖数: 4120 | 17 大致有三本书奠定了我的程序语言的理解,
一是超大规模集成电路设计。这门课我F,不过当时把好几个计算机图形的问题搞清楚
,觉得也值那一学期,觉得随时可以去教研究生计算机图形。说这门可,里面的捷径太
多,说bug 是里说当然,就是为了干活,你不可能设计一个全真值表,绝不可能。弄出
个东西上线,再调,这就是工程。这段核心是你不可能设计一个全真值表,其它都是废
话。
第二是bruce wikel thinking in c; 还有后来thinking in C++; 他好像那个时候很清
楚地要代码重用,现在好像神经病出钱,要他hype。cpp 就是c语言加宏,trovald 永
远不可能干掉C
第三是计算机架构,computer architecture; 现在叫computer organization
就是讲从高级语言到cpu 的优化,比如
while (i<100) i+=',n';
regex.relace(',\n$','');
这种基本的优化非常们清。
整个这个路程不多不少八年左右。达到我现在的理解。当然有更高的理解,弄斧了。
其实以现在的技术手段,copy/paste 也没什么大不了,编译器,解释器应该自己去
diff或更聪明一点。第一门课,我基本没学,但知道了厉害;第三门,大致听老师讲了
一遍,马马虎虎;第二的两本书加谭好强的C语言,每道题都做过一边。大概有五门课
有多线程的大作业。
golang
【在 m*****n 的大作中提到】 : coroutine 和 functional programming : google算是把coroutine给整明白了,python却在全局单核锁的条件下把coroutine弄得 : 非常繁琐。好像Java也绷不住了,也上了coroutine. 新版的C++是不是也上了? : 要我说python这种连起双核都很难的语言,老老实实学Qt玩signal slot就得了,整个 : 屁的coroutine脱了裤子放屁。 : 第二大烂坑是functional programming,其实就是去对象化。这里面最激进的是golang : ,到现在我也不明白为什么要彻底去除class和methods. 谁知道原因?
|
h**********c 发帖数: 4120 | 18 while (i<100) i+=',n';
这个地方写错了,你大致理解就行了 |
i********y 发帖数: 6 | 19 coroutine火起来是随着大规模几十万人同时在线服务的流行,例如阿里的游戏三国志
战略版。
【在 n******t 的大作中提到】 : golang這種帶了把進程調度弄進runtime的,只能寫某些很固定panttern的程序。如果 : 機器上有一堆程序都是go寫得,肯定behaviour亂七八糟,沒準星的。不過golang的 : tooling是強項這個還是要承認的。 : coroutine是個很老的東西,不知道這幾年爲啥炒這麼熱。大部分程序都不用增加併發 : 度,而不用增加併發度去用coroutine是會讓程序變慢的,很多人這種基本的道理都不 : 知道。
|
m*****n 发帖数: 3575 | 20 浪费了我半个小时,订单系统连锁都没说。
这种家伙的东西还是少看吧!
【在 h****e 的大作中提到】 : : golang
|
n******t 发帖数: 4406 | 21 所以我說了,coroutine只適合某一類程序。
此外,幾十萬人在線服務幾十年前就有方案了,用select/kqueue/epoll那一族就可以
而且性能更好,程序要難寫一點點而已,其實也就是boiler plate。
如果
併發
都不
【在 i********y 的大作中提到】 : coroutine火起来是随着大规模几十万人同时在线服务的流行,例如阿里的游戏三国志 : 战略版。
|
i********y 发帖数: 6 | 22 有几个帖子提到Python单核问题。
实践中Python经常调用外部程序,用Python的线程调用外部程序的过程中操作系统是充
分利用了多核的。例如开十个线程用top查看会发现外部程序的CPU各核分布比较均匀,
虽然Python自己只占一核。 |
N***e 发帖数: 61 | 23 看到Coroutine,第一时间我想到了PERL。
golang
【在 m*****n 的大作中提到】 : coroutine 和 functional programming : google算是把coroutine给整明白了,python却在全局单核锁的条件下把coroutine弄得 : 非常繁琐。好像Java也绷不住了,也上了coroutine. 新版的C++是不是也上了? : 要我说python这种连起双核都很难的语言,老老实实学Qt玩signal slot就得了,整个 : 屁的coroutine脱了裤子放屁。 : 第二大烂坑是functional programming,其实就是去对象化。这里面最激进的是golang : ,到现在我也不明白为什么要彻底去除class和methods. 谁知道原因?
|
m*****n 发帖数: 3575 | 24 我再强调一遍,go的goroutine是一种进步——进步就体现在它用信号槽机制取代了反
复读取全局变量。
当一个线程的继续进行有赖于别的线程改变状态,即它是依赖于别的线程的,传统的做
法是
while True:
if some_flag ==1:
break
[sleep some time] #这行如果不加会造成cpu忙,成熟的程序员会加这行
resume the rest of process
自旋检查线程是极大的浪费,无论从写代码还是从运行效率上来讲。
而goroutine引入了channel,它会自动的阻塞在channel的收端,等待别的线程给向
channel发信号,来解锁。代码层面上前四行可以压缩成一行。
这是一种广义上的信号槽机制。信号槽机制是Qt发明的,为了避免图形操作界面的各线
程无序启动,造成卡死,统一建了个注册机制,由主线程去调度启停,当一个线程想要
启动一个函数,即起一个coroutine时,它只能发一个信号,被主线程捕获后,主线程
在不忙的时候再去启动槽函数。所以goroutine的成功是在于运用了信号槽机制,而不
是在coroutine本身。
凡是看不明白关键是信号槽,而错以为是协程更优秀的诸多跟风者,
只能是东施效颦。 |
n******t 发帖数: 4406 | 25
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
你這是哪個師傅教出來的??TMD多線程程序不是這麼寫的好吧。
【在 m*****n 的大作中提到】 : 我再强调一遍,go的goroutine是一种进步——进步就体现在它用信号槽机制取代了反 : 复读取全局变量。 : 当一个线程的继续进行有赖于别的线程改变状态,即它是依赖于别的线程的,传统的做 : 法是 : while True: : if some_flag ==1: : break : [sleep some time] #这行如果不加会造成cpu忙,成熟的程序员会加这行 : resume the rest of process : 自旋检查线程是极大的浪费,无论从写代码还是从运行效率上来讲。
|
m*****n 发帖数: 3575 | 26 呵呵了,就是这么写的。
状态机原理。
而且给我做项目的某高校导师的一群研究生连那句sleep都不会写。
【在 n******t 的大作中提到】 : : ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ : 你這是哪個師傅教出來的??TMD多線程程序不是這麼寫的好吧。
|
h**********c 发帖数: 4120 | 27 我就像当初我们讲computer architecture的老P还是比较牛的,这人是美国人跑到加拿
大我们学校做AP,我们学校的教职十个有三个左右是普林以上的出身,一半左右是多大
麦几尔博士资历,我们系的几个中国人好像都是清华的。说实在清华就是读书好,淡然
有能力比例肯定要高,但你不能保证每个能力都强,出东西还得有狠劲能拼,肯花钱花
时间能选对研究生。说老P,从我听课看computer architecture这本书他每章都很熟,
但他不好好讲,发牢骚,他在美国参加过CPU设计,还有什么方案没被军方采用。他确
实懂,我学的很烂,我当时的目标是争取读博,第二非常想去auto desk 的inventor在
蒙特利尔有一个大组。我们学校学生参差不齐,很多勤工俭学,上夜课;有一个越南妹
平均A,最高是A+,我记得不是平均是最低A,应该包括的老P的课。属于基本工的东西
就是一段程序算多少个tick.还有一个和我打过架的土耳其xbzz后来去麦基尔读研。然
后讲cache的设计,一句话,你的程序写的好,cache和内存之间的折腾就少,现在我觉
得concurrency就肯定少不了中断处理,那CPU就会不停的折腾,大概就是另外一门课讲
的sigjump longjump,我当时都没有重点学。当时觉得数学很高大上,图形学找工作的
本钱,最后都没有用上。这本书太后,去年买了最新版,内容大变,一开是就说,原来
的内容请去看computer organizaiton.基本优化减少程序里的branch,核心是避免寻址
有很大的偏移,避免cache miss.
想到那里说哪里,我很不以为然的是,基本每天都看hacker news,象google 亚麻, FB
这种牛逼到放卫星的公司,很少写文章从CPU层面benchmark他们的程序,应用,框架。
现代CPU自己就能统计一些关键数据,而且有商业的专业的bench mark 工具。非常的
amateur sheep我记得这本书就介绍了一些工具。里面的信息量太多挺厚一本书。
新版买了看了几十页,搬家就放下了。大致章节不是我想看的东西。还得看computer
organization.
现在很多事情莫名其妙,美国本来是一个很较真的国家,这也是我们来的原因。我觉得
如果你想在这里退休,就叫叫真吧。
【在 h**********c 的大作中提到】 : 大致有三本书奠定了我的程序语言的理解, : 一是超大规模集成电路设计。这门课我F,不过当时把好几个计算机图形的问题搞清楚 : ,觉得也值那一学期,觉得随时可以去教研究生计算机图形。说这门可,里面的捷径太 : 多,说bug 是里说当然,就是为了干活,你不可能设计一个全真值表,绝不可能。弄出 : 个东西上线,再调,这就是工程。这段核心是你不可能设计一个全真值表,其它都是废 : 话。 : 第二是bruce wikel thinking in c; 还有后来thinking in C++; 他好像那个时候很清 : 楚地要代码重用,现在好像神经病出钱,要他hype。cpp 就是c语言加宏,trovald 永 : 远不可能干掉C : 第三是计算机架构,computer architecture; 现在叫computer organization
|