SlideShare a Scribd company logo
ASYNCHRONOUS
PROGRAMMING
    FTW!
    (SAWYER X)
DOES THIS SOUND FAMILIAR?
               "Hi"
            "Hi, dad"
         "Got a minute?"
              "Yes"
     "I'm looking for a movie
        Where do I start?"
    "Go to the cinema website"
      "What's the address?"
 "www.whatchamacallit.whatever"
          "Just a sec..."
...
...
...
...
"Well?"
"Ah! It loaded! What now?"
  "Click on new movies"
         "OK..."
           ........
         "Well?"
        "Loading"
    *sounds of clicks*
"OK, now what?"
      "Find a movie you want"
            "Then what?"
"Click on it, you'll have instructions"
        * eternity passes by *
             "WELL?!?"
     "Just a sec... it's loading..."
          /me shoots myself
ILLUSTRATED
          (USING WWW::MECHANIZE)
$eh>e(cnm_r)
 mc­gt$ieaul;
i  mc­sces){
 f($eh>ucs  
  $eh>lc(NwMve';
   mc­cik'e ois)
  i  mc­sces){
   f($eh>ucs  
    m mve  mc­fn_nus..
     y@ois=$eh>idipt(.)
  }
   
}
LET'S TRY THIS AGAIN...
                 "Hi"
               "Hi, dad"
            "Got a minute?"
                 "Yes"
        "I'm looking for a movie
           What should I do?"
"Go to this website, click on new movies
  Then pick a movie, and click on it"
             "Thank you"
           "You're welcome"
GREAT SUCCESS!
CALLBACKS
        Reference to a code
        Passed as an argument
        Can be called by some other code
sbtysmtig{
 u r_oehn 
  m ipt  hf;
   y$nu =sit
  m c    hf;
   y$b  =sit
  m rsl  oeoeain$nu)
   y$eut=sm_prto(ipt;

  i  rsl­{sau' q'K  
   f($eut>'tts}e O'){
    $b> rsl­{cnet})
     c­($eut>'otn' ;
  }
   
}

tysmtig sm admipt,sb{
 r_oehn("oerno nu" u 
  m cnet=sit
   y$otn  hf;
  sy"ucsflrqetsy cnet"
   a Scesu eus as$otn!;
})
  ;
ILLUSTRATED, ASYNC
          (USING WWW::MECHANIZE)
$eh>e($ieaul u 
 mc­gt cnm_r,sb{
  $eh>lc('e ois,sb{
   mc­cik NwMve' u 
    $eh>idipt(.. u  y@ois=@  
     mc­fn_nus .,sb{m mve  _})
  })
    ;
})
  ;
WHY IS THIS USEFUL?
Allow others to decide if something is good or not
m jn  uo>e(
 y$uo=Jn­nw
  hss >[w11112222]
   ot = q<... ...>,
  cek >{
   hcs= 
    Fig= 
     Pn >{
      o_ucs >sb{
       nsces= u 
        m  jn,$ot dt   _
         y($uo hs,$aa)=@;
        m  i,$os ag)=$uo>nlz_igrsl(
         y($p ls,$v   jn­aayepn_eut
          $aa>'ter}
           dt­{sdr',
        )
         ;

        $ef>e_ot hs,$v ;
         sl­sths($ot ag)
      }
       ,

      o_al= u 
       nfi >sb{
        m  jn,$ot)=@;
         y($uo hs   _

        $ef>eeehs(hs)
         sl­dlt_ot$ot;
      }
       ,
    }
     
  }
   
);
WHY IS THIS USEFUL?
Allow others to decide if something is good or not
Allow easy stepping
Algorithm::Diff::Callback
ueAgrtm:if:alakq<ifary ifhse>
 s loih:Df:Clbc wdf_rasdf_ahs;

df_ras
 ifary(
  odfml_ebr,
   @l_aiymmes
  nwfml_ebr,
   @e_aiymmes
  sb{pit'ap oha bu ,sit}
   u  rn Hpyt eraot' hf ,
  sb{pit'or oha bu ,sit}
   u  rn Sryt eraot' hf ,
);

df_ahs
 ifhse(
  oddtis
   %l_eal,
  nwdtis
   %e_eal,
  sb{sy'ot'  hf ,
   u  a Ls , sit}
  sb{sy'and' hf ,
   u  a Gie ,sit}
  sb{
   u 
    m  ky bfr,$fe   _
     y($e,$eoe atr)=@;
    sy"kycagdfo bfr o$fe"
     a $e hne rm$eoet atr;
  }
   ,
);
WHY IS THIS USEFUL?
Allow others to decide if something is good or not
Allow easy stepping
Allow control by other process (a type of IOC)
Allow asynchronous code
THE EVENT LOOP
Create loop
Register events
Run them
Let the user keep registering new events
m eet  ..;
 y%vns=(.)

wie(){
 hl 1 
  frahm eet(ky eet  
   oec y$vn  es%vns){
    $vn­(;
     eet>)
  }
   
}
m eet;%vns=(.)
 y%vns eet  ..;

wie(){
 hl 1 
  frahm eet(ky eet  
   oec y$vn  es%vns){
    $vn­(;
     eet>)
  }
   
}

wie(){
 hl 1 
  frahm eet(ky eet  
   oec y$vn  es%vns){
    i  eet{eet{tm' =tm  
     f($vns$vn}'ie}< ie){
      $vns$vn}'oe}>)
       eet{eet{cd'­(;
    }
     
  }
   
}

sbadeet{
 u d_vn 
  m  tm,$oe)=@;
   y($ie cd   _
  $vns$d{tm'  tm;
   eet{i}'ie}=$ie
  $vns$d{cd'  cd;
   eet{i}'oe}=$oe
  $d+
   i+;
}
EVENT TYPES
Timers (one-time, recurring, sleep replacement)
I/O (input output, including networking)
FUCK TALK
LET'S GO PROGRAMMING
IO::ASYNC
Loop interface: IO::Async::Loop
You can connect to hosts using it
You can add listeners to it (handles, sockets, etc.)
Explicitly call "run" when ready
ueI:Ayc:tem
 s O:sn:Sra;
ueI:Ayc:op
 s O:sn:Lo;
 
m lo  O:sn:Lo­nw
 y$op=I:Ayc:op>e;

$op>onc(
 lo­cnet
  hs   = sm.te.ot,
   ot   >"oeohrhs"
  srie = 24,
   evc  >135
  sctp = sra'
   okye >'tem,
  
  o_tem= u  . ,
   nsra >sb{..}
  
  o_eov_ro >sb{
   nrsleerr= u 
    de"antrsle­$[1"
     i Cno eov  _­]
  }
   ,

  o_onc_ro >sb{
   ncneterr= u 
    de"antcnet­$[]fie _­]
     i Cno onc  _0 ald$[1"
  }
   ,
);

$op>u;
 lo­rn
o_tem= u 
 nsra >sb{
  m  sra   _
   y($tem)=@;

  $tem>ofgr(
   sra­cniue
    o_ed= u 
     nra >sb{
      m  sl,$ufe,$o   _
       y($ef bfrf ef)=@;

      wie {bfrf ~s^.)/){
       hl($$ufe}= /(*n/  
        sy"eevdaln 1;
         a Rcie  ie$"
      }
       

      rtr ;
       eun0
    }
     
  )
   ;

  $tem>rt(A nta iehr';
   sra­wie'niiilln ee)

  $op>d(sra)
   lo­ad$tem;
}
ANOTHER EXAMPLE
$pr MO:sn Me:Ayc:TP­ 
  el­I:Ayc­Nt:sn:HT E'
  I:Ayc>d(m ht  e:Ayc:TP>e ;
   O:sn­ad y$tp=Nt:sn:HT­nw)
  syfrI:Ayc>wi_l(mp{$tp>e(_  )
   a o O:sn­aatal a  ht­gt$)} 
'>ls­fUL.x
   ito­Rstt


         Oh hai parallel HTTP GET!
POE
Loop interface: POE::Kernel
Runs "sessions" (POE::Session)
Each session is a context of events
Each session has an ID and heap
Call events in a current or different session
Explicitly call POE::Kernel->run when ready
POE
uePE #At­nldsPE:enladPE:eso.
 s O;  uoicue O:Kre n O:Ssin

#..dfn alak us(etsie .
  . eieclbcssb nx ld)..

fr(.1){
 o 1.0 
  PE:eso­cet(
   O:Ssin>rae
    iln_tts= 
     niesae >{
      _tr  = &ade_tr,
       sat  >hnlrsat
      iceet= &ade_nrmn,
       nrmn >hnlriceet
      _tp  = &ade_tp
       so   >hnlrso,
    }
     
  )
   ;
}

PE:enl>u(;
 O:Kre­rn)
sbhnlrsat{
 u ade_tr 
 m  kre,$ep ssin)=@[KRE,HA,SSIN]
  y($enl ha,$eso   _ ENL EP ESO ;
 sy"eso ,$eso­I,"hssatd;
  a Ssin" ssin>D  a tre"
 $ep>'on'  ;
  ha­{cut}=0
 $enl>il(iceet)
  kre­yed'nrmn';
}

sbhnlriceet{
 u ade_nrmn 
 m  kre,$ep ssin)=@[KRE,HA,SSIN]
  y($enl ha,$eso   _ ENL EP ESO ;
 sy"eso ,$eso­I,"cutdt ,+$ep>'on';
  a Ssin" ssin>D  one o" +ha­{cut}
 $enl>il(iceet)i ha­{cut}<1;
  kre­yed'nrmn' f$ep>'on'  0
}

sbhnlrso 
 u ade_tp{
 sy"eso ,$[ESO]>D  a tpe"
  a Ssin" _SSIN­I,"hssopd;
}
sbhnlrsat{
 u ade_tr 
 m  kre,$ep ssin)=@[KRE,HA,SSIN]
  y($enl ha,$eso   _ ENL EP ESO ;
 sy"eso ,$eso­I,"hssatd;
  a Ssin" ssin>D  a tre"
 $ep>'on'  ;
  ha­{cut}=0
 $enl>il(iceet)
  kre­yed'nrmn';
}
sbhnlriceet{
 u ade_nrmn 
 m  kre,$ep ssin)=@[KRE,HA,SSIN]
  y($enl ha,$eso   _ ENL EP ESO ;
 sy"eso ,$eso­I,"cutdt ,+$ep>'on';
  a Ssin" ssin>D  one o" +ha­{cut}
 $enl>il(iceet)i ha­{cut}<1;
  kre­yed'nrmn' f$ep>'on'  0
}
sbhnlrso 
 u ade_tp{
 sy"eso ,$[ESO]>D  a tpe.n;
  a Ssin" _SSIN­I,"hssopd"
}
fr(.1){
 o 1.0 
  PE:eso­cet(
   O:Ssin>rae
    iln_tts= 
     niesae >{
      _tr  = &ade_tr,
       sat  >hnlrsat
      iceet= &ade_nrmn,
       nrmn >hnlriceet
      _tp  = &ade_tp
       so   >hnlrso,
    }
     
  )
   ;
}
PE:enl>u(;
 O:Kre­rn)
MORE CONDENSED
uePE
 s O;

fr(.1){
 o 1.0 
  m cut=0
   y$on  ;

  PE:eso­cet(
   O:Ssin>rae
    iln_tts= 
     niesae >{
      _tr  = u 
       sat  >sb{
        sy"eso ,$[ESO]>D  a tre"
         a Ssin" _SSIN­I,"hssatd;
        PE:enl>il(iceet)
         O:Kre­yed'nrmn';
      }
       ,
      iceet= u 
       nrmn >sb{
        PE:enl>il(iceet)i +cut<1;
         O:Kre­yed'nrmn' f+$on  0
        sy"eso ,$[ESO]>D  one o$on"
         a Ssin" _SSIN­I,"cutdt cut;
      }
       ,
      _tp  = u 
       so   >sb{
        sy"eso ,$[ESO]>D  a tpe"
         a Ssin" _SSIN­I,"hssopd;
      }
       ,
    }
     
  )
   ;
}

PE:enl>u(;
 O:Kre­rn)
REFLEX
Written by author of POE
"How POE would be written if I had Moose back then"
Stresses composability, reusability
Includes plenty of additional roles
USING MOOSE
{
  pcaeAp
   akg p;
  ueMoe
   s os;
  etns'elx:ae;
   xed Rfe:Bs'
  ueRfe:Itra;
   s elx:nevl
  ueRfe:Tat:ace wths;
   s elx:ri:Wthd'ace'
 
  wthstce >(
   ace ikr= 
    ia = Rfe:Itra'
     s  >'elx:nevl,
    stp=  nevl= ,at_eet=  ,
     eu >{itra >1 uorpa >1}
  )
   ;
 
  sbo_ikrtc 
   u ntce_ik{
    sy'ika ,saa(oatm) ..;
     a tc t' clrlclie,'.'
  }
   
}
 
ei p­nw)>u_l(;
 xtAp>e(­rnal)
COMPLEX? TRY THIS...
ueRfe:Itra;
 s elx:nevl
 
m t=Rfe:Itra­nw
 y$  elx:nevl>e(
  itra  = ,
   nevl  >1
  at_eet= ,
   uorpa >1
  o_ik  = u  a tmrtce'}
   ntc   >sb{sy'ie ikd ,
);
 
$­rnal)
 t>u_l(;
ANYEVENT
AnyEvent is very thin and very fast
Was written to support as many loops as possible
... that conform to the author's rules of compatibility
Does not use a loop handler, simply runs
Does use conditional variables
Has AE for faster performance
ueAyvn;
 s nEet
m cut=0
 y$on  ;
m c  =Ayvn­cnvr
 y$v   nEet>oda;
m t  =Ayvn­tmr
 y$    nEet>ie(
  atr  >2
   fe  = ,
  itra >06
   nevl= .,
  c    >sb{
   b   = u 
    sy'h iei o:' nEet>o;
     a Tetm snw ,Ayvn­nw
    +$on =1 n c­sn;
     +cut= 0ad$v>ed
  }
   ,
);

$v>ev
 c­rc;
m w w=Ayvn­i(
 y$;$  nEet>o
  f  >SDN
   h = *TI,
  pl >''
   ol= r,
  c  >sb{
   b = u 
    cop(m ipt= ;
     hm  y$nu  )
    sy"ed ipt;
     a ra:$nu"
    udf$;
     ne w
  }
   ,
);
USAGES OF ASYNCHRONOUS CODE
     GUI
     Services (HTTP/SMTP/etc.)
     Performance
     Off-loading tasks
THANK YOU

More Related Content

PDF
Finding a lost song with Node.js and async iterators - EnterJS 2021
PDF
Finding a lost song with Node.js and async iterators - NodeConf Remote 2021
PDF
Finding a lost song with Node.js and async iterators
PPTX
Oliver Pirate Project
PPT
Shell and perl scripting classes in mumbai
PDF
Maze solving app listing
PDF
Intro to OAuth
PDF
Build a custom (micro)framework with ZF2 Components (as building blocks)
Finding a lost song with Node.js and async iterators - EnterJS 2021
Finding a lost song with Node.js and async iterators - NodeConf Remote 2021
Finding a lost song with Node.js and async iterators
Oliver Pirate Project
Shell and perl scripting classes in mumbai
Maze solving app listing
Intro to OAuth
Build a custom (micro)framework with ZF2 Components (as building blocks)

What's hot (12)

PDF
The Wolf
KEY
An introduction to Ruby
DOCX
Adventure time
PDF
CS50 Lecture2
PPTX
PDF
Mahabhara katha
PDF
CS50 Lecture1
PDF
“Entschuldigung, 
 das weiß ich leider nicht.”
PDF
Yahoo! JAPANとKotlin
PPT
01 linux basics
PPT
Making sense of big data
PPT
Big Data LDN 2016: Making Sense of Big Data with Open Source Search
The Wolf
An introduction to Ruby
Adventure time
CS50 Lecture2
Mahabhara katha
CS50 Lecture1
“Entschuldigung, 
 das weiß ich leider nicht.”
Yahoo! JAPANとKotlin
01 linux basics
Making sense of big data
Big Data LDN 2016: Making Sense of Big Data with Open Source Search
Ad

Similar to Asynchronous programming FTW! (20)

DOCX
Unix commands
PPTX
What Have We Lost - A look at some historical techniques
PDF
HPC Essentials
PPT
Verilog Lecture5 hust 2014
PDF
Good ideas that we forgot
PPTX
embedded system with raspberry piVarun[1].pptx
PDF
Smalltalk, the dynamic language
PDF
Holistic Aggregate Resource Environment
PPTX
"Hints" talk at Walchand College Sangli, March 2017
PPTX
Platform agnostic information systems development
PDF
PerlIntro
PDF
PerlIntro
PDF
Cois240 lesson01
PDF
Presenter manual embedded systems (specially for summer interns)
PDF
Download full ebook of Linux Socket Programming Walton Sean instant download pdf
PDF
Oral tradition in software engineering: Passing the craft across generations
PDF
resume-8.1-software
PDF
Solution Manual for C How to Program, 7/E 7th Edition Paul Deitel, Harvey Deitel
PPT
COMPUTER INTRODUCTION
PDF
Perl intro
Unix commands
What Have We Lost - A look at some historical techniques
HPC Essentials
Verilog Lecture5 hust 2014
Good ideas that we forgot
embedded system with raspberry piVarun[1].pptx
Smalltalk, the dynamic language
Holistic Aggregate Resource Environment
"Hints" talk at Walchand College Sangli, March 2017
Platform agnostic information systems development
PerlIntro
PerlIntro
Cois240 lesson01
Presenter manual embedded systems (specially for summer interns)
Download full ebook of Linux Socket Programming Walton Sean instant download pdf
Oral tradition in software engineering: Passing the craft across generations
resume-8.1-software
Solution Manual for C How to Program, 7/E 7th Edition Paul Deitel, Harvey Deitel
COMPUTER INTRODUCTION
Perl intro
Ad

More from xSawyer (14)

PDF
do_this and die();
PDF
XS Fun
PDF
Asynchronous Programming FTW! 2 (with AnyEvent)
ODP
Moose - YAPC::NA 2012
PDF
Our local state, my, my - Understanding Perl variables
PDF
Your first website in under a minute with Dancer
ODP
Moose talk at FOSDEM 2011 (Perl devroom)
PDF
PerlDancer for Perlers (FOSDEM 2011)
PDF
Perl Dancer for Python programmers
ODP
When Perl Met Android (YAPC::EU 2010)
PDF
Perl Dancer on Android (first attempt)
ODP
Source Code Management systems
ODP
Moose (Perl 5)
ODP
Red Flags in Programming
do_this and die();
XS Fun
Asynchronous Programming FTW! 2 (with AnyEvent)
Moose - YAPC::NA 2012
Our local state, my, my - Understanding Perl variables
Your first website in under a minute with Dancer
Moose talk at FOSDEM 2011 (Perl devroom)
PerlDancer for Perlers (FOSDEM 2011)
Perl Dancer for Python programmers
When Perl Met Android (YAPC::EU 2010)
Perl Dancer on Android (first attempt)
Source Code Management systems
Moose (Perl 5)
Red Flags in Programming

Recently uploaded (20)

PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
A comparative analysis of optical character recognition models for extracting...
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PPT
Teaching material agriculture food technology
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
Cloud computing and distributed systems.
PPTX
Machine Learning_overview_presentation.pptx
PPTX
MYSQL Presentation for SQL database connectivity
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Network Security Unit 5.pdf for BCA BBA.
Diabetes mellitus diagnosis method based random forest with bat algorithm
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Review of recent advances in non-invasive hemoglobin estimation
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
The Rise and Fall of 3GPP – Time for a Sabbatical?
Dropbox Q2 2025 Financial Results & Investor Presentation
A comparative analysis of optical character recognition models for extracting...
NewMind AI Weekly Chronicles - August'25-Week II
Building Integrated photovoltaic BIPV_UPV.pdf
Encapsulation_ Review paper, used for researhc scholars
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Mobile App Security Testing_ A Comprehensive Guide.pdf
Teaching material agriculture food technology
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Cloud computing and distributed systems.
Machine Learning_overview_presentation.pptx
MYSQL Presentation for SQL database connectivity

Asynchronous programming FTW!

  • 1. ASYNCHRONOUS PROGRAMMING FTW! (SAWYER X)
  • 2. DOES THIS SOUND FAMILIAR? "Hi" "Hi, dad" "Got a minute?" "Yes" "I'm looking for a movie Where do I start?" "Go to the cinema website" "What's the address?" "www.whatchamacallit.whatever" "Just a sec..."
  • 4. "Well?" "Ah! It loaded! What now?" "Click on new movies" "OK..." ........ "Well?" "Loading" *sounds of clicks*
  • 5. "OK, now what?" "Find a movie you want" "Then what?" "Click on it, you'll have instructions" * eternity passes by * "WELL?!?" "Just a sec... it's loading..." /me shoots myself
  • 6. ILLUSTRATED (USING WWW::MECHANIZE) $eh>e(cnm_r) mc­gt$ieaul; i  mc­sces){ f($eh>ucs     $eh>lc(NwMve';   mc­cik'e ois)   i  mc­sces){   f($eh>ucs       m mve  mc­fn_nus..     y@ois=$eh>idipt(.)   }    }
  • 7. LET'S TRY THIS AGAIN... "Hi" "Hi, dad" "Got a minute?" "Yes" "I'm looking for a movie What should I do?" "Go to this website, click on new movies Then pick a movie, and click on it" "Thank you" "You're welcome"
  • 9. CALLBACKS Reference to a code Passed as an argument Can be called by some other code sbtysmtig{ u r_oehn    m ipt  hf;   y$nu =sit   m c    hf;   y$b  =sit   m rsl  oeoeain$nu)   y$eut=sm_prto(ipt;   i  rsl­{sau' q'K     f($eut>'tts}e O'){     $b> rsl­{cnet})     c­($eut>'otn' ;   }    } tysmtig sm admipt,sb{ r_oehn("oerno nu" u    m cnet=sit   y$otn  hf;   sy"ucsflrqetsy cnet"   a Scesu eus as$otn!; })  ;
  • 10. ILLUSTRATED, ASYNC (USING WWW::MECHANIZE) $eh>e($ieaul u  mc­gt cnm_r,sb{   $eh>lc('e ois,sb{   mc­cik NwMve' u      $eh>idipt(.. u  y@ois=@       mc­fn_nus .,sb{m mve  _})   })    ; })  ;
  • 11. WHY IS THIS USEFUL? Allow others to decide if something is good or not
  • 12. m jn  uo>e( y$uo=Jn­nw   hss >[w11112222]   ot = q<... ...>,   cek >{   hcs=      Fig=      Pn >{       o_ucs >sb{       nsces= u          m  jn,$ot dt   _         y($uo hs,$aa)=@;         m  i,$os ag)=$uo>nlz_igrsl(         y($p ls,$v   jn­aayepn_eut           $aa>'ter}           dt­{sdr',         )         ;         $ef>e_ot hs,$v ;         sl­sths($ot ag)       }       ,       o_al= u        nfi >sb{         m  jn,$ot)=@;         y($uo hs   _         $ef>eeehs(hs)         sl­dlt_ot$ot;       }       ,     }        }    );
  • 13. WHY IS THIS USEFUL? Allow others to decide if something is good or not Allow easy stepping
  • 14. Algorithm::Diff::Callback ueAgrtm:if:alakq<ifary ifhse> s loih:Df:Clbc wdf_rasdf_ahs; df_ras ifary(   odfml_ebr,   @l_aiymmes   nwfml_ebr,   @e_aiymmes   sb{pit'ap oha bu ,sit}   u  rn Hpyt eraot' hf ,   sb{pit'or oha bu ,sit}   u  rn Sryt eraot' hf , ); df_ahs ifhse(   oddtis   %l_eal,   nwdtis   %e_eal,   sb{sy'ot'  hf ,   u  a Ls , sit}   sb{sy'and' hf ,   u  a Gie ,sit}   sb{   u      m  ky bfr,$fe   _     y($e,$eoe atr)=@;     sy"kycagdfo bfr o$fe"     a $e hne rm$eoet atr;   }   , );
  • 15. WHY IS THIS USEFUL? Allow others to decide if something is good or not Allow easy stepping Allow control by other process (a type of IOC) Allow asynchronous code
  • 16. THE EVENT LOOP Create loop Register events Run them Let the user keep registering new events
  • 17. m eet  ..; y%vns=(.) wie(){ hl 1    frahm eet(ky eet     oec y$vn  es%vns){     $vn­(;     eet>)   }    }
  • 18. m eet;%vns=(.) y%vns eet  ..; wie(){ hl 1    frahm eet(ky eet     oec y$vn  es%vns){     $vn­(;     eet>)   }    } wie(){ hl 1    frahm eet(ky eet     oec y$vn  es%vns){     i  eet{eet{tm' =tm       f($vns$vn}'ie}< ie){       $vns$vn}'oe}>)       eet{eet{cd'­(;     }        }    } sbadeet{ u d_vn    m  tm,$oe)=@;   y($ie cd   _   $vns$d{tm'  tm;   eet{i}'ie}=$ie   $vns$d{cd'  cd;   eet{i}'oe}=$oe   $d+   i+; }
  • 19. EVENT TYPES Timers (one-time, recurring, sleep replacement) I/O (input output, including networking)
  • 20. FUCK TALK LET'S GO PROGRAMMING
  • 21. IO::ASYNC Loop interface: IO::Async::Loop You can connect to hosts using it You can add listeners to it (handles, sockets, etc.) Explicitly call "run" when ready
  • 22. ueI:Ayc:tem s O:sn:Sra; ueI:Ayc:op s O:sn:Lo;   m lo  O:sn:Lo­nw y$op=I:Ayc:op>e; $op>onc( lo­cnet   hs   = sm.te.ot,   ot   >"oeohrhs"   srie = 24,   evc  >135   sctp = sra'   okye >'tem,      o_tem= u  . ,   nsra >sb{..}      o_eov_ro >sb{   nrsleerr= u      de"antrsle­$[1"     i Cno eov  _­]   }   ,   o_onc_ro >sb{   ncneterr= u      de"antcnet­$[]fie _­]     i Cno onc  _0 ald$[1"   }   , ); $op>u; lo­rn
  • 23. o_tem= u  nsra >sb{   m  sra   _   y($tem)=@;   $tem>ofgr(   sra­cniue     o_ed= u      nra >sb{       m  sl,$ufe,$o   _       y($ef bfrf ef)=@;       wie {bfrf ~s^.)/){       hl($$ufe}= /(*n/           sy"eevdaln 1;         a Rcie  ie$"       }              rtr ;       eun0     }        )   ;   $tem>rt(A nta iehr';   sra­wie'niiilln ee)   $op>d(sra)   lo­ad$tem; }
  • 24. ANOTHER EXAMPLE $pr MO:sn Me:Ayc:TP­   el­I:Ayc­Nt:sn:HT E'   I:Ayc>d(m ht  e:Ayc:TP>e ;   O:sn­ad y$tp=Nt:sn:HT­nw)   syfrI:Ayc>wi_l(mp{$tp>e(_  )   a o O:sn­aatal a  ht­gt$)}  '>ls­fUL.x   ito­Rstt Oh hai parallel HTTP GET!
  • 25. POE Loop interface: POE::Kernel Runs "sessions" (POE::Session) Each session is a context of events Each session has an ID and heap Call events in a current or different session Explicitly call POE::Kernel->run when ready
  • 26. POE uePE #At­nldsPE:enladPE:eso. s O;  uoicue O:Kre n O:Ssin #..dfn alak us(etsie .  . eieclbcssb nx ld).. fr(.1){ o 1.0    PE:eso­cet(   O:Ssin>rae     iln_tts=      niesae >{       _tr  = &ade_tr,       sat  >hnlrsat       iceet= &ade_nrmn,       nrmn >hnlriceet       _tp  = &ade_tp       so   >hnlrso,     }        )   ; } PE:enl>u(; O:Kre­rn)
  • 27. sbhnlrsat{ u ade_tr   m  kre,$ep ssin)=@[KRE,HA,SSIN]  y($enl ha,$eso   _ ENL EP ESO ;  sy"eso ,$eso­I,"hssatd;  a Ssin" ssin>D  a tre"  $ep>'on'  ;  ha­{cut}=0  $enl>il(iceet)  kre­yed'nrmn'; } sbhnlriceet{ u ade_nrmn   m  kre,$ep ssin)=@[KRE,HA,SSIN]  y($enl ha,$eso   _ ENL EP ESO ;  sy"eso ,$eso­I,"cutdt ,+$ep>'on';  a Ssin" ssin>D  one o" +ha­{cut}  $enl>il(iceet)i ha­{cut}<1;  kre­yed'nrmn' f$ep>'on'  0 } sbhnlrso  u ade_tp{  sy"eso ,$[ESO]>D  a tpe"  a Ssin" _SSIN­I,"hssopd; }
  • 28. sbhnlrsat{ u ade_tr   m  kre,$ep ssin)=@[KRE,HA,SSIN]  y($enl ha,$eso   _ ENL EP ESO ;  sy"eso ,$eso­I,"hssatd;  a Ssin" ssin>D  a tre"  $ep>'on'  ;  ha­{cut}=0  $enl>il(iceet)  kre­yed'nrmn'; } sbhnlriceet{ u ade_nrmn   m  kre,$ep ssin)=@[KRE,HA,SSIN]  y($enl ha,$eso   _ ENL EP ESO ;  sy"eso ,$eso­I,"cutdt ,+$ep>'on';  a Ssin" ssin>D  one o" +ha­{cut}  $enl>il(iceet)i ha­{cut}<1;  kre­yed'nrmn' f$ep>'on'  0 } sbhnlrso  u ade_tp{  sy"eso ,$[ESO]>D  a tpe.n;  a Ssin" _SSIN­I,"hssopd" } fr(.1){ o 1.0    PE:eso­cet(   O:Ssin>rae     iln_tts=      niesae >{       _tr  = &ade_tr,       sat  >hnlrsat       iceet= &ade_nrmn,       nrmn >hnlriceet       _tp  = &ade_tp       so   >hnlrso,     }        )   ; } PE:enl>u(; O:Kre­rn)
  • 29. MORE CONDENSED uePE s O; fr(.1){ o 1.0    m cut=0   y$on  ;   PE:eso­cet(   O:Ssin>rae     iln_tts=      niesae >{       _tr  = u        sat  >sb{         sy"eso ,$[ESO]>D  a tre"         a Ssin" _SSIN­I,"hssatd;         PE:enl>il(iceet)         O:Kre­yed'nrmn';       }       ,       iceet= u        nrmn >sb{         PE:enl>il(iceet)i +cut<1;         O:Kre­yed'nrmn' f+$on  0         sy"eso ,$[ESO]>D  one o$on"         a Ssin" _SSIN­I,"cutdt cut;       }       ,       _tp  = u        so   >sb{         sy"eso ,$[ESO]>D  a tpe"         a Ssin" _SSIN­I,"hssopd;       }       ,     }        )   ; } PE:enl>u(; O:Kre­rn)
  • 30. REFLEX Written by author of POE "How POE would be written if I had Moose back then" Stresses composability, reusability Includes plenty of additional roles
  • 31. USING MOOSE {   pcaeAp   akg p;   ueMoe   s os;   etns'elx:ae;   xed Rfe:Bs'   ueRfe:Itra;   s elx:nevl   ueRfe:Tat:ace wths;   s elx:ri:Wthd'ace'     wthstce >(   ace ikr=      ia = Rfe:Itra'     s  >'elx:nevl,     stp=  nevl= ,at_eet=  ,     eu >{itra >1 uorpa >1}   )   ;     sbo_ikrtc    u ntce_ik{     sy'ika ,saa(oatm) ..;     a tc t' clrlclie,'.'   }    }   ei p­nw)>u_l(; xtAp>e(­rnal)
  • 32. COMPLEX? TRY THIS... ueRfe:Itra; s elx:nevl   m t=Rfe:Itra­nw y$  elx:nevl>e(   itra  = ,   nevl  >1   at_eet= ,   uorpa >1   o_ik  = u  a tmrtce'}   ntc   >sb{sy'ie ikd , );   $­rnal) t>u_l(;
  • 33. ANYEVENT AnyEvent is very thin and very fast Was written to support as many loops as possible ... that conform to the author's rules of compatibility Does not use a loop handler, simply runs Does use conditional variables Has AE for faster performance
  • 34. ueAyvn; s nEet m cut=0 y$on  ; m c  =Ayvn­cnvr y$v   nEet>oda; m t  =Ayvn­tmr y$    nEet>ie(   atr  >2   fe  = ,   itra >06   nevl= .,   c    >sb{   b   = u      sy'h iei o:' nEet>o;     a Tetm snw ,Ayvn­nw     +$on =1 n c­sn;     +cut= 0ad$v>ed   }   , ); $v>ev c­rc;
  • 35. m w w=Ayvn­i( y$;$  nEet>o   f  >SDN   h = *TI,   pl >''   ol= r,   c  >sb{   b = u      cop(m ipt= ;     hm  y$nu  )     sy"ed ipt;     a ra:$nu"     udf$;     ne w   }   , );
  • 36. USAGES OF ASYNCHRONOUS CODE GUI Services (HTTP/SMTP/etc.) Performance Off-loading tasks