0

这个简单的例子,我在JRuby上运行多线程,但它只有一个线程运行不能运行赛璐珞

require 'benchmark' 
require 'celluloid/current' 

TIMES = 10 

def delay 
    sleep 1 
    # 40_000_000.times.each{|i| i*i} 
end 

p 'celluloid: true multithreading?' 

class FileWorker 
    include Celluloid 

    def create_file(id) 
    delay 
    p "Done!" 
    File.open("out_#{id}.txt", 'w') {|f| f.write(Time.now) } 
    end 
end 

workers_pool = FileWorker.pool(size: 10) 

TIMES.times do |i| 
    # workers_pool.async.create_file(i) # also not happens 
    future = Celluloid::Future.new { FileWorker.new.create_file(i) } 
    p future.value 
end 

所有创建的文件间隔1秒。

请帮助将赛璐珞变成多线程模式,其中所有文件都是同时创建的。

谢谢!

修复:

事实上,“期货”数组有助于!

futures = [] 
TIMES.times do |i| 
    futures << Celluloid::Future.new { FileWorker.new.create_file(i) } 
end 
futures.each {|f| p f.value } 

感谢jrochkind

+0

在'create_file'的第一行中'delay'调用是怎么回事?我不确定'delay'方法是什么,我没有在Celluloid API中找到它。 – jrochkind

+0

它的延迟功能,更正http://pastie.org/10447853 –

回答

2

啊,我想我明白了。

在您的循环中,您正在等待每个未来完成,在循环结束时 - 这意味着您在创建下一个未来之前等待一个未来完成。

TIMES.times do |i| 
    # workers_pool.async.create_file(i) # also not happens 
    future = Celluloid::Future.new { FileWorker.new.create_file(i) } 
    p future.value 
end 

尝试将其更改为这样:

futures = [] 
TIMES.times do |i| 
    futures << Celluloid::Future.new { FileWorker.new.create_file(i) } 
end 
futures.each {|f| p f.value } 

在您的版本,首先考虑的迭代循环 - 你创建一个未来,然后调用future.value它等待将来才能完成。在未来完成之前,future.value语句不会返回,并且循环迭代不会完成,并且会再次循环以创建另一个未来,直到语句返回。因此,您在创建下一个产品之前,通过等待每个未来value来实现同步。

有意义吗?

此外,对于这样的短代码块,如果将代码直接放在问题中,则适用于代码格式化,而不是链接出来,这对于潜在SO回答者来说更容易。

一般来说,如果您使用的是像Celluloid这样相当广泛使用的库,并且发现它似乎没有做它应该做的主要事情 - 第一个猜测应该可能是您的代码中的一个错误,而不是图书馆从根本上根本不工作(以前别人会注意到!)。问题标题反映出,即使只是“为什么我的赛璐珞代码看起来没有多线程工作”也许比标题暗示赛璐珞根本无法工作 - 如果没有问题本身的任何代码展示的话,它可能会得到更多的关注!

+0

谢谢你纠正我的问题。我会更有礼貌:) –