Ruby的Thread是伪线程,不管代码中写了多少个Thread.new,Ruby都只启动了一个线程去运行这些Thread的代码。
这样做的确使得Ruby的Thread很容易控制,程序也不容易产生类似死锁这类严重的线程问题。但是效率始终无法提高,因为在ruby进程中,实际上只有一个真实的线程在运行,同样的代码在那么多核或者多cpu的电脑上运行效率和单核cpu的电脑上的效率并不会相差多少。
于是有两个衍生问题:
第一,不太可能用ruby编写桌面程序。桌面程序大都是单进程,多线程模型。因为ruby用的是伪线程,Thread.new用的越多,运行效率只会越来越低。CPU需要分配时间片给Ruby进程中的控制Ruby伪线程代码的Thread,然后这个Thread还要在切换运行全部的Ruby伪线程代码。所以在单进程中,Thread.new的应用数目是存在一定上限的。
也许把Ruby代码嵌入到别的项目中就可以应用于桌面程序,不过同样,Thread.new还是不能多用。
同样的,想用Ruby来编写一个稍高性能服务器程序,也是不行的。伪线程问题始终在制约这点。
第二,Ruby项目最好采用多进程模型,只有这样才能更好的利用硬件资源。这个也是目前Ruby Web的设置方式。
想让ruby运行的好,似乎只有这种办法了。不过多进程模型,除了web应用之外,还真不知道那里可以这样用,请知道更多的同学提醒下。
当然,如果hack过ruby的源代码,说不定能够解决这个伪线程问题,不过这个难度甚高,不容易实现。
最后的疑问是"Ruby为啥要用伪线程?"
这样做的确使得Ruby的Thread很容易控制,程序也不容易产生类似死锁这类严重的线程问题。但是效率始终无法提高,因为在ruby进程中,实际上只有一个真实的线程在运行,同样的代码在那么多核或者多cpu的电脑上运行效率和单核cpu的电脑上的效率并不会相差多少。
于是有两个衍生问题:
第一,不太可能用ruby编写桌面程序。桌面程序大都是单进程,多线程模型。因为ruby用的是伪线程,Thread.new用的越多,运行效率只会越来越低。CPU需要分配时间片给Ruby进程中的控制Ruby伪线程代码的Thread,然后这个Thread还要在切换运行全部的Ruby伪线程代码。所以在单进程中,Thread.new的应用数目是存在一定上限的。
也许把Ruby代码嵌入到别的项目中就可以应用于桌面程序,不过同样,Thread.new还是不能多用。
同样的,想用Ruby来编写一个稍高性能服务器程序,也是不行的。伪线程问题始终在制约这点。
第二,Ruby项目最好采用多进程模型,只有这样才能更好的利用硬件资源。这个也是目前Ruby Web的设置方式。
想让ruby运行的好,似乎只有这种办法了。不过多进程模型,除了web应用之外,还真不知道那里可以这样用,请知道更多的同学提醒下。
当然,如果hack过ruby的源代码,说不定能够解决这个伪线程问题,不过这个难度甚高,不容易实现。
最后的疑问是"Ruby为啥要用伪线程?"