2013-05-15 3 views
3

나는 예를 들어, 구글의 병렬 검색이, 펄 응용 프로그램이병렬 요청

6 
1 
7 
10 
3 
9 
2 
5 
8 
4 
DONE1 (should be before render) 
DONE2 (should be before render) 
Found! (render) 

나는 Mojolicious 응용 프로그램에서이 코드를 사용하는 경우 컨트롤러 :

package MyApp::Google; 

use Mojo::Base 'Mojolicious::Controller'; 

sub search { 

    my $self = shift; 

    my $delay = Mojo::IOLoop->delay(sub { $self->app->log->debug('DONE1 (should be before render)') }); 

    foreach my $i (1 .. 10) { 
     $delay->begin(); 

     $self->ua->get("http://www.google.ru/search?q=$i" => sub { 
      $self->app->log->debug($i); 
      $delay->end(); 
     }); 
    } 

    $delay->wait() unless $delay->ioloop->is_running(); 

    $self->app->log->debug('DONE2 (should be before render)'); 

    return $self->render_text('Found!'); 

} 
그것은 잘못된 방향으로 가고있다

:

,451,515,
[Wed May 15 11:07:32 2013] [debug] Routing to controller "MyApp::Google" and action "search". 
[Wed May 15 11:07:32 2013] [debug] DONE2 (should be before render) 
[Wed May 15 11:07:32 2013] [debug] 200 OK (0.005689s, 175.778/s). 
[Wed May 15 11:07:32 2013] [debug] 1 
[Wed May 15 11:07:32 2013] [debug] 8 
[Wed May 15 11:07:32 2013] [debug] 10 
[Wed May 15 11:07:32 2013] [debug] 5 
[Wed May 15 11:07:32 2013] [debug] 3 
[Wed May 15 11:07:32 2013] [debug] 9 
[Wed May 15 11:07:32 2013] [debug] 6 
[Wed May 15 11:07:32 2013] [debug] 2 
[Wed May 15 11:07:32 2013] [debug] 4 
[Wed May 15 11:07:32 2013] [debug] 7 
[Wed May 15 11:07:32 2013] [debug] DONE1 (should be before render) 

나는 그렇게 $delay->wait() 대기하지 않는 것 같아요. 왜 그럴거야?

답변

5

이 경우 컨트롤러에서 render_later 메서드를 호출하여 자동 렌더링을 비활성화해야합니다. (http://mojolicio.us/perldoc/Mojolicious/Controller#render_later)

그냥 검색 컨트롤러에 다음 문자열을 추가 :

$self->render_later; 

전체 예제 :

#!/usr/bin/perl -wl 
use Mojolicious::Lite; 

get '/' => sub { 
    my $self = shift; 
    $self->render_later; 
    my $delay = Mojo::IOLoop->delay(sub { 
     $self->app->log->debug('Delay finished!'); 
     $self->render(text => 'test!'); 
    }); 
    for my $i (0 .. 5) { 
     my $end = $delay->begin; 
     Mojo::IOLoop->timer($i => sub { 
      $self->app->log->debug($i); 
      $end->(); 
     }); 
    } 
}; 

app->start; 
+0

가 줘, 제발, 일부 작업 예. 나는 할 수 없다. 해결책은 루트 문제를 해결하지 못합니다. 모든 작업이 완료 될 때까지 기다리는 것이 아닙니다. – Tema

+0

오, 죄송합니다. 지연에서 ** finish ** 이벤트 (** Mojo :: IOLoop-> delay ** 함수의 첫 번째 인수)에서 실제 렌더링을 수행해야합니다. 완전한 예 나는 주된 대답에 추가했다. –

+3

에서'render_text' (그리고 다른 많은 단축키)가 Mojolicious 4.0에서 제거되었습니다. 대신에 표준 양식'$ self-> render (text => 'test!');를 사용해야한다. –

관련 문제