참고로 액세스를 동기화하지 않는 한 FYI처럼 동일한 배열에 대한 읽기/쓰기 문제가 발생할 수 있습니다. Ruby에 내장 된 Queue 클래스를보십시오. 그것은 스레드의 일부입니다.
충돌하지 않는 여러 생산자/소비자를 가질 수 있습니다. 다음은 설명서의 내용입니다.
이 클래스는 스레드 간의 통신을 동기화하는 방법을 제공합니다.
예 :
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
, 그것은 완전히 개방형입니다. Queue에는 필요한 empty?
메소드가 있기 때문에 쉽게 탈출 할 수 있습니다.
그건 내 $ 0.02이고 어떻게할까요?
추가 아이디어를 얻으려면 페이지 오른쪽에있는 "관련"스레드를보십시오.
'@@ payloads' 배열이 표준 루비 배열입니까? –
스택 오버플로에 대해 묻고 싶은 코드를 시도한 다음 오류가 발생하면 물어보십시오. 멈추고 조언을 구하기 전에 시도하십시오. 자세한 내용은 http://sscce.org/를 참조하십시오. –