2014-01-15 4 views
-1

모든 클라이언트 연결에 "AnyEvent timer"감시자 객체를 생성하는 서버가 있습니다 (AnyEvent 루프에 추가).Perl AnyEvent 동시성 내부

use AnyEvent; 

... 

my $db_handle = myschema->connect(); 

my $w; $w = AnyEvent->timer (
     interval => $interval, 
     after => $interval, 
     cb => sub { 
      ## Remove from loop on some condition 
      unless ($ret = _check_session($sid)) { 
      undef $w; 
      } 

      ## Execute main logic 
      $db_handle->lookup($sid); 
     } 
); 

... 

따라서 콜백은 $ interval 초마다 실행됩니다. 많은 클라이언트가있는 경우, 일부 콜백이 동시에 실행되어야합니다. AnyEvent는 어떻게 처리합니까? 이러한 콜백을 차례로 실행합니까? 아니면이 경우에 동시성 메커니즘이 있습니까? 이렇게 콜백이 동시에 실행됩니다. (예를 들어, 여러 스레드를 생성하여 동시에 실행해야하는 여러 콜백의 실행 속도를 높이려면)
내 서버의 경우 콜백은 데이터베이스 조회를 수행합니다. 데이터베이스 연결에 대한 데이터베이스 핸들이 이벤트 루프 외부에서 초기화되었습니다. 내 관심사는 AnyEvent에 동시성 메커니즘이있는 경우 하나의 콜백은 다른 하나가 데이터베이스 룩업을 마칠 때까지 기다려야하고 데이터베이스 핸들이 자유 롭기 때문에 콜백을 동시에 실행할 수 없다는 것이다.
P. 대답은 '이케 가미'덕분입니다.

+0

질문에 대한 답변이 있으면 질문에 감사를 표시하는 대신 답변에 표시 옆에있는 체크 표시를 선택하십시오. StackOverflow에 오신 것을 환영합니다! – ikegami

+0

귀하의 참여에 감사드립니다. 대답은 IMHO에 응답되지 않습니다. 질문에서 제기 된 문제에 대해 더 구체적으로 설명 할 수 있습니다. 그리고 누군가가 당신에게 감사 할 때 (특히 첫 반응이 코멘트가 아닌 답을 쓰는 것이었을 때, 즉 당신 자신을 먼저 가르쳐 준 후에) 이렇게 논평하는 것이 예의라고 생각합니다. –

+0

아, 업데이트의 일부를 알지 못했습니다. – ikegami

답변

3

AnyEvent는 동시성을 생성하지 않습니다. 전화를 걸면 이벤트를 처리합니다 (예 : ->recv).

0

ikegami에 따르면 AnyEvent에는 동시성이 없습니다. 모든 이벤트 루프를 사용하면 '비동기 적으로'이벤트를 처리 할 수 ​​있으므로 동시에 코드를 실행하지 않고도 여러 요청/작업/타이머를 동시에 진행할 수 있습니다. 이벤트는 항상 순차적으로 처리됩니다.

여러 타이머가 동시에 만료되는 특정 경우 - 각 타이머가 차례대로 처리되며 (만료 시간에 정렬 됨) 모든 만료 타이머는 각 이벤트 루프 반복에서 처리됩니다. pure Perl 구현을위한 Loop.pm의 라인 208-213 which you can view @ CPAN.

관련 문제