X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=slides.html;h=8904bd24addaf2a9151822c1795c18636db47498;hb=e9a895bf42ef9b706aba2d2770ae61dad28ea9a4;hp=6d589b4552d0e1edcb157ecabcd8f1e42d7d6b5f;hpb=fa698f7b8f498a04b0394f5cadc2cadf0a6fb21a;p=chaz%2Ftalk-event-driven-programming-in-perl diff --git a/slides.html b/slides.html index 6d589b4..8904bd2 100644 --- a/slides.html +++ b/slides.html @@ -70,6 +70,16 @@ At it's core, event-driven programming is this simple. But there are some complications and things to knows, which is why this talk exists. +--- +class: center, middle + +![Help desk](img/helpdesk.jpg) + +.small[ +Image by Soniachat8. +This image is licensed under the [Creative Commons Attribution-Share Alike 4.0 International](https://creativecommons.org/licenses/by-sa/4.0/deed.en) license. +] + --- name: graph-eventloop class: center, middle @@ -378,9 +388,13 @@ class: syscalls - [`clock_gettime`](http://man.he.net/man2/clock_gettime) - What time is it now? --- +class: center, middle ## Reactor pattern +--- +## Reactor pattern + .big[ - Queues events asynchronously. - Demultiplexes and dispatches synchronously. @@ -395,9 +409,26 @@ class: center, middle ![Reactor](img/reactor.svg) --- -class: ex-basicreactor +class: ex-basicreactor1 + +## Using a reactor + +```perl +my $reactor = My::Reactor->new; + +# Set up event handlers +$reactor->slurp_file($filepath, \&handle_slurp_event); +$reactor->timer(5, \&handle_timer_event); +$reactor->listen($socket, \&handle_new_connect_event); +... + +$reactor->run_loop; +``` + +--- +class: ex-basicreactor2 -## The basic reactor +## The basic reactor implementation ```perl our $timers = [...]; @@ -414,9 +445,9 @@ while (1) { ``` --- -class: ex-basicreactor +class: ex-basicreactor2 -## The basic reactor +## The basic reactor implementation ```perl our $timers = [...]; @@ -445,6 +476,10 @@ while (1) { - [`Mojo::Reactor::Poll`](https://metacpan.org/source/Mojo::Reactor::Poll) ] +??? +These links, which will be available to you with the slides, link directly to the source code of these modules on +metacpan so you can take a look at how they work. + --- name: not-all-roses class: center, middle @@ -498,6 +533,39 @@ $promise->on_fail(sub { ... }); --- class: center, middle +## `SIGPIPE` + +--- +class: sigpipe +## `SIGPIPE` + +- Sent to your program when it writes to a pipe that was closed. + +-- +- Default signal handler terminates the program. + +--- +class: ex-sigpipe + +## Solution: Ignore `SIGPIPE` + +```perl +$SIG{PIPE} = 'IGNORE'; +``` + +??? +Some event loops do this for you. + +-- +.big[ +Look for `EPIPE` from syscalls (like [`write`](http://man.he.net/man2/write)) instead. + +(You *are* checking return codes from your system calls... right?) +] + +--- +class: center, middle + ## Use [`Future::AsyncAwait`](https://metacpan.org/pod/Future::AsyncAwait). ???