2013-07-15 1 views
1

나는 sinatra를 설정하고 github repo에서 커밋을 듣습니다. 현재 설정 한 시스템이 게시물을 수신 한 다음 페이로드를 페이로드 배열로 푸시합니다. 여러 게시물 GitHub의에서 오는 경우에 나는 다음다른 스레드가 사용하고있는 데이터 세트 조작하기

@@payloads.each do .... whatever 

전화, 즉, 사람들은 더 커밋 @@payloads.each가 실행되는 동안, 어떻게됩니까 밀어? 하나의 페이로드가 있으면 다른 하나가 푸시됩니다. payloads.each 콜이 다른 시간에 전화를 걸립니까? 또는 호출이 이루어지면 .each 호출이 통과하는 페이로드 수가 돌로 설정되도록 설정되어 있습니까?

+0

'@@ payloads' 배열이 표준 루비 배열입니까? –

+0

스택 오버플로에 대해 묻고 싶은 코드를 시도한 다음 오류가 발생하면 물어보십시오. 멈추고 조언을 구하기 전에 시도하십시오. 자세한 내용은 http://sscce.org/를 참조하십시오. –

답변

1

참고로 액세스를 동기화하지 않는 한 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이고 어떻게할까요?

추가 아이디어를 얻으려면 페이지 오른쪽에있는 "관련"스레드를보십시오.

+0

좋은 답변, 고마워! – Noah

1

이 표준 루비 배열 인 경우 푸시 된 페이로드는 #each 반복에 포함되어야합니다.

한 스레드가 배열을 반복하고 다른 스레드가 같은 배열에 추가되면 반복되는 스레드에 추가 된 항목이 포함됩니다.

Take a look at this gist이 동작을 보여주는 간단한 프로그램이 있습니다. 다른 스레드가 배열에 추가하는 동안 하나의 스레드가 반복됩니다. 루비에서 스레드 스케줄링의 특성으로 인해 결과는 매번 다를 수 있습니다.

관련 문제