需要跑一个耗费很大资源的多线程程序,问题在于 ruby 只能利用一个核,于是八核最终的 CPU 利用率就变成了 25%,效率还跟不上。。 怎么能解决这个问题呢,因为锁的存在么。JRuby 是不是可以解决这个问题,如果解决的话它内部解决多核同步的时候又是怎么做的,会不会产生各种灵异事件。。 感谢。
可以看一下这篇文章,Ruby Concurrency and Parallelism: A Practical Tutorial,从概念到实现都讲得很清楚。
用户级的线程是不参与 cpu 调度的
你的代码是 IO-bounded,还是 cpu-bound?
如果 io 为主的话,可以利用多核。因为 io 时,ruby 会释放 GIL,可以并行。
JRuby 可以解决这个问题,JRuby 没有 GIL,多线程情况下,JavaVM 会调度线程在不同的 CPU 核心上执行,关于是否出现灵异事件,建议你测试一下,你给出的信息不足以判断。
只要是在一个 Ruby VM 中运行的代码,在任何情况下,GIL 都保证了你的代码在同一个时间只能被一个 CPU 运行,如果你要用多核的话,需要看你的程序处理的任务能否分割,然后多进程的方式执行子任务。