2013-03-06 2 views
0

EventMachine은 하나의 메인 스레드에서이 작업의 개별 스레드와 모든 콜백에서 모든 작업을 실행합니다. 데이터의 부분간에 데이터 처리의 경쟁력을 떨어 뜨릴 필요가있을 때 매우 유용합니다. 네트워크에서 데이터를 수신하고 대기열에 결과를 처리 할 수 ​​있습니다. 그러나 나는 더 나아갈 필요가있다. 내 사이트에 많은 사용자가 있고 각각에 대해 별도의 대기열을 만들고 싶습니다. 따라서 각 사용자마다 단일 EM처럼 작동해야합니다. 그러나 나는 할 수 없다. EventMachine은 싱글 톤입니다.Ruby : EventMachine 및 별도의 콜백 대기열

Thread.new do 
    EM.run 
end 

def request_from_user 
    operation = Proc.new { 
    # network request 
    } 
    callback = Proc.new { 
    # some heavy data processing 
    2*2 
    } 
    5.times do 
    EM.defer(operation, callback) 
    end 
end 

3.times do 
    request_from_user 
end 

그래서 우리는 mainthread 대기열에서 콜백 혼잡이 있습니다. 일부 데이터는 대기열 끝에 처리되고 일부 데이터는 중간에 처리됩니다. 부하가 크면 대기열이 커지고 일부 사용자는 매우 큰 지연으로 결과를 수신합니다. 어쨌든 단일 스레드 콜백에서 request_from_user를 실행하면 하나의 EM 주 스레드에서 실행됩니다.

그럼 어떻게해야합니까? 그것은 각 사용자에 대해 별도의 콜백 대기열을 만들고 concurent 또는 그것을 실행할 수 있습니까? EventMachine 없이도 사용할 수 있습니다. 셀룰로이드 ...

+0

EM이 "단일"메인 라인 스레드에서 모든 작업을 실행한다고 생각하니 그렇지 않습니까? – rogerdpack

+0

EM.defer를 사용하면 작업이 EMs 스레드 풀의 스레드에서 실행되고 콜백이 주 스레드에서 실행됩니다. – dj2

답변

0

콜백에서 작업을 작업으로 이동하지 않는 것이 좋습니다 (데이터 처리를 마쳤을 때만 콜백이 실행 됨). 또는 EM.defer 호출을 사용하지 마십시오. 모든 종류의 대기 시간을 초래할 수 있으므로 주 스레드에서 무거운 데이터 처리를 수행하고 싶지는 않습니다.

관련 문제