lua中"协程"和erlang"进程",go等脚本 与 java 中“多线程”的对比理解

来源:互联网 发布:印度军工很差知乎 编辑:程序博客网 时间:2024/06/05 11:41

Lua,Erlang,go这种只有协程或者所谓的轻量级"进程"的语言,虽然它们让程序执行变得可以控制,假如:他们即使一下子开了1000个线程,实际上一次只能运行1个线程,本身并没有利用多核的优势。  假如:让这几种语言和具有真正线程概念能利用多核cpu的java对比下。  如果一下子都处理1000个任务,因为前几个语言没有利用多核cpu,那处理速度会不会比java慢很多呢? 这个怎么理解。

找了很多资料,他们只介绍了:lua的协程或者Erlang的进程,只是说让程序变得可控这种优势,但是却没介绍:如果这种不是真正的“线程”的语言来处理任务时,是否会处理的缓慢等问题。


可以查看lua源代码,比如:lua的协程,我可以找到lua_newthread这个实现,实际用的堆栈来实现的线程.

而且:云风的skynet这个服务器端框架,利用actor模型,里面主要就是用的协程,实际开发中,并没有我说的那个问题。所以我想知道:我哪里理解错了。

有种BUG叫设计如此  12:55:05
你的疑问是什么啊?

有种BUG叫设计如此  12:57:10
不能利用多和资源是吧

有种BUG叫设计如此  12:58:08
最简单的写个程序试试就知道了,协程里面写死循环看,能不能把cpu跑到100%

Lukey  13:01:41
我就在用go

Lukey  13:01:45
确实不错

王哲小号  13:02:20
lua的“协程”并不是线程,说到底,这1000个协程一定是顺序执行的,严格来说,它是在某个线程环境下执行的,除掉本身的消耗,它的消耗另外一部分在管理这些协程以及代码跳转,至于是否能够利用到多核,取决于上层的高级语言对于线程的性能能否较好的分摊到多核上去。

王哲小号  13:03:21
golang在设计之初就是针对多核的,所以上层语言的设定就针对多核下的环境,golang中很多东西都针对多核进行了特别的优化。

海浪  13:07:03
我想问的是。。。你纠结携程是不是利用多核,是要干啥

王哲小号  13:07:42
这个是在语言设计层面需要考虑的事情

有种BUG叫设计如此  13:08:06
逻辑上也需要考虑 的

王哲小号  13:08:07
至今还没有看到过哪种语言还需要你手动考虑到多核的

王哲小号  13:08:24
比如?

有种BUG叫设计如此  13:08:56
至少要知道才知道什么时候用进程,什么时候用线程,什么时候用协程啊

海浪  13:09:35
你连这都不知道。。。。。

王哲小号  13:09:49
这个我觉得更多的程序性能上面的事情

王哲小号  13:09:57
而不是考虑多核

王哲小号  13:10:25
一个问题不只有一种解,我们要的是最优解

有种BUG叫设计如此  13:10:45
如果你不知道一个语言的协程是不是可以分派到多核处理,那就是连那些也不知道呗

王哲小号  13:10:48
进程、线程这种解是不是最优,我觉得具有一定的讨论余地

有种BUG叫设计如此  13:18:28
一个lua vm对应一个os 线程

有种BUG叫设计如此  13:18:49
skynet 应该是用的多个lua vm利用的多核资源 

北京|欠费  13:32:23
是否使用多核 编译器上面考虑的吧 你在语言层面 考虑没有意义。

有种BUG叫设计如此  13:41:23
我觉得不管是编辑器语言层面,还是框架层面,还是逻辑层面,都需要考虑,才能写出好程序 











0 0