2013-07-15 22 views
1

我有sinatra设置,听从github回购提交。我目前设置的系统,侦听一篇文章,然后将有效载荷推送到有效载荷数组。我然后调用操作另一个线程正在使用的数据集

@@payloads.each do .... whatever 

如果多个职位从GitHub进来,即人们更推而提交的@@payloads.each运行,会发生什么?如果有一个有效载荷,那么另一个被推动,payloads.each呼叫又是一圈?或者它是否设置成呼叫完成后呼叫所经过的有效载荷的数量被设置为石头?

+0

“@@ payloads”数组是一个标准的ruby数组吗? –

+0

关于堆栈溢出,我们希望你已经尝试了你想问的代码,然后在遇到错误后询问,在尝试之前不要停下来寻求建议。请参阅http://sscce.org/了解更多信息。 –

回答

1

作为供参考,除非您同步访问,否则可能会遇到读取/写入相同阵列的问题。看看Ruby的内置Queue类。它是Thread的一部分。

您可以有多个不会碰撞的生产者/消费者。以下是文档所述内容:

此类提供了一种同步线程间通信的方法。

实施例:

require 'thread' 

    queue = Queue.new 

    producer = Thread.new do 
     5.times do |i| 
     sleep rand(i) # simulate expense 
     queue << i 
     puts "#{i} produced" 
     end 
    end 

    consumer = Thread.new do 
     5.times do |i| 
     value = queue.pop 
     sleep rand(i/2) # simulate expense 
     puts "consumed #{value}" 
     end 
    end 

    consumer.join 

至于阵列上使用each循环,我想语法应该使用:

loop do 
    break if @@payloads.empty? 
end 

each意味着有限的一组元件来迭代。该说明称:

调用给定块一次自我的每个元素....

在其他语言中你不能改变你迭代,因为元素的数量的容器设置在循环的开始处;试图更改容器会引发错误。依靠each允许你这样做,可能会导致期望你会看到其他语言的行为;在我看来,你依靠的是副作用或侧门,这不是一个好习惯。

loop并不意味着,因为它是一个简单的循环,你必须有条件地打破使用自己的逻辑。这里的例子为loop

loop do 
    print "Input: " 
    line = gets 
    break if !line or line =~ /^qQ/ 
    # ... 
end 

没有的元素数量的假设,它是完全开放的。而且,这很容易爆发,因为队列有必要的方法empty?

这是我的0.02美元,我该怎么做。

看看页面右侧的“相关”线程,以获得更多的想法。

+0

很好的答案,谢谢! – Noah

1

只要@@payloads是一个标准的ruby数组,推送的有效载荷应该包含在#each迭代中。

当一个线程遍历一个数组,另一个线程追加到同一个数组时,迭代线程将包含附加项。

Take a look at this gist它有一个简单的程序来演示这种行为。一个线程迭代而另一个线程添加到数组。由于ruby中线程调度的性质,每次结果都可能有所不同。

相关问题