2011-03-09 3 views
0

의 내가 내 레일 웹 응용 프로그램에서 다음과 같은 스레딩 있다고 가정 해 봅시다 : 당신이 볼 수 있듯이여러 httpd 스레드에서 변수를 레일스와 공유하는 방법은 무엇입니까?

class MyController 
    def my_action 
    count = 0 
    arr = [] 

    10.times do |i| 
     arr[i] = Thread.new { 
     sleep(rand(0)/10.0) 
     Thread.current["mycount"] = count 
     count += 1 
     } 
    end 

    arr.each {|t| t.join; print t["mycount"], ", " } 
    puts "count = #{count}" 
    end 
end 

의 '계산'변수는 모든 스레드에서 공유된다.

이제는 내가 뭘 원하는 주 '카운트' 여러 아파치 요청에 걸쳐이며 는 MyController에있는 my_action 그 변수에 액세스 할 수 있습니다. 예를 들어, httpd 프로세스를 제공하기 위해 루비 프로세스가 생성되면 그 범위 내에서 변수 개수를 보유 할 수 있으며, 그러면 httpd 프로세스를 위해 생성 된 루비 프로세스가 해당 변수에 액세스 할 수 있습니다.

memcached, 데이터베이스 및 세션 변수를 사용하는 것은 의문의 여지가 없습니다. 궁극적으로 '카운트'는 실제로 FTP 연결 인 리소스 객체가 될 것입니다.

이것이 가능합니까? 아마도 this과 같은 Apache/Passenger 근로자를 사용하고 있을까요?

예제 코드는 인정 될 것입니다.

+1

레일스는 디자인 상 단일 스레드이므로, 사용자가하려는 일이 가능하거나 권장되지 않는다고 생각합니다. 적어도, 나는 전에 그것을 한 번도 본 적이 없다. –

+0

글쎄. 이 같은 것을 꺼내는 어떤 방법이 있어야합니다. –

답변

1

정확하게 이것은 전역 변수를 사용하여 가능합니다. Rails의 전역 변수는 $ count와 같이 달러 기호로 시작하는 변수입니다.

+0

액세스가 동기화되지 않는 한 전역 조건에 경쟁 조건이 포함되지 않습니까? – Crashalot

+0

당신의 사용에 따라, 나는 그렇게 생각합니다. FTP 요청을 가로 질러 FTP 연결을 활성 상태로 유지하기 위해 하나를 사용하고있었습니다. –

관련 문제