2010-04-26 2 views
1

나는 기본적으로 몇 가지 입력 값을 취하는시나 응용 프로그램을 가지고 다음 등 예를 들어Ruby (Sinatra?)와의 동시 웹 요청은 무엇입니까?

플리커, 트위터와 같은 외부 서비스에서 그 가치와 일치하는 데이터를 찾습니다

입력 : "채터 누가 추추" 겠습니까을

@images = Flickr::...find...images.. 

@tweets = Twitter::...find...tweets... 

@results << @images 

@results << @tweets 

S : 지금 내가 좋아하는 뭔가를 등

을 나가서 트위터에서 채터 누가 추추에 플리커의 이미지와 트윗을 찾을 수 o 내 질문은, Ruby에서 이러한 요청을 동시에 실행하는 효율적인 방법이 있습니까? 트윗이 끝나기 전에 이미지가 끝나기를 기다리는 대신.

답변

2

스레드는 작동하지만 원유 도구입니다. 다음과 같이 시도해 볼 수 있습니다.

flickr_thread = Thread.start do 
    @flickr_result = ... # make the Flickr request 
end 

twitter_thread = Thread.start do 
    @twitter_result = ... # make the Twitter request 
end 

# this makes the main thread wait for the other two threads 
# before continuing with its execution 
flickr_thread.join 
twitter_thread.join 

# now both @flickr_result and @twitter_result have 
# their values (unless an error occurred) 

코드를 약간 수정하고 적절한 오류 감지 기능을 추가해야합니다. 인스턴스 변수가 스레드 블록 내에서 선언 될 때 작동하는 경우 기억할 수 없습니다. 로컬 변수는 명시 적으로 외부에 선언되지 않은 한 그렇게하지 않습니다.

나는 이것을 우아한 해결책이라고 부르지는 않겠지 만, 그것이 효과가 있다고 생각합니다. 너무 복잡하지는 않습니다. 이 경우 운좋게도 조인과는 별도로 잠금 또는 동기화가 필요하지 않으므로 코드가 잘 읽습니다.

아마도 이런 도구를 사용하면 EventMachine (특히 em-http-request 하위 프로젝트)과 같은 도구가 도움이 될 수 있습니다. 아마 더 높은 수준에서 코딩하는 것이 더 쉬워 질 수 있습니다. 쓰레드는 제대로하기가 어렵습니다.

+0

감사를 요청합니다. 나는 내가하려고하는 것에 대한 접근 방식을 좋아한다. 나는 한 발을 내줄 것이다. 모두에게 감사 드려요. – cbmeeks

1

예 스레드가 아닌 이유는 무엇입니까?

나는 이해했다. 사용자가 양식을 제출하자마자 모든 요청을 동시에 병렬 처리하고 싶습니까? 당신은 하나의 멀티 쓰레드 컨트롤러를 가질 수 있습니다. (Ruby 쓰레드 지원은 정말 잘 작동합니다.) 하나의 요청을받은 다음, 외부 쿼리 서비스를 병렬로 실행 한 다음 하나의 응답으로 응답하거나 클라이언트 측에서 각각에 대해 하나의 아약스 포스트를 보냅니다. 서비스를 처리하고 처리하십시오 (각각의 외부 서비스에는 사용자 고유의 컨트롤러/조치가있을 수 있습니다).

2

비동기식 Ajax 요청을 사용하여 각 유형 (이미지, 트위터)을 독립적으로 가져 오도록 클라이언트 측 변경을 고려할 수 있습니다. 서버 스레드의 문제 (그 중 하나는 문제)는 하나의 서비스가 중지되면 전체 스레드가 종료 될 때까지 대기하는 것입니다. Ajax를 사용하면 이미지 섹션, 트위터 섹션 등을로드 할 수 있으며, 다른 사람이 멈 추면 다른 사람들도 결과를 볼 수 있습니다. 결국 요청을 시간 초과하여 해당 섹션에만 실패 고래 또는 무언가를 표시 할 수 있습니다.

+0

나는이 시점에서 두 번째로 각 서비스에 대해 서로 다른 URL 끝점을 가지고 AJAX로 모두 끝점을 호출한다. – MatthewFord

1

이것을 위해 YQL을 사용해보십시오. 서브 쿼리를 지원하기 때문에 필요한 모든 것을 JSON으로 출력하는 단일 (클라이언트 측, 짝수) 호출로 필요한 모든 것을 가져올 수 있습니다. 이미 튜토리얼 톤이 있습니다.

+0

재미있는 생각이다. 나는 그걸 생각하지 않았다. – cbmeeks

+0

URL 단축 링크를 확장하십시오. –