]> Dogcows Code - chaz/talk-event-driven-programming-in-perl/blobdiff - slides.html
add reactor usage example
[chaz/talk-event-driven-programming-in-perl] / slides.html
index d86ee03aae1a18331b5ee606173fcdcf85011bb0..8904bd24addaf2a9151822c1795c18636db47498 100644 (file)
@@ -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.
 
 
 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
 ---
 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?
 
 ---
 - [`clock_gettime`](http://man.he.net/man2/clock_gettime) - What time is it now?
 
 ---
+class: center, middle
 
 ## Reactor pattern
 
 
 ## Reactor pattern
 
+---
+## Reactor pattern
+
 .big[
 - Queues events asynchronously.
 - Demultiplexes and dispatches synchronously.
 .big[
 - Queues events asynchronously.
 - Demultiplexes and dispatches synchronously.
@@ -395,9 +409,26 @@ class: center, middle
 ![Reactor](img/reactor.svg)
 
 ---
 ![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     = [...];
 
 ```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     = [...];
 
 ```perl
 our $timers     = [...];
@@ -445,6 +476,93 @@ while (1) {
 - [`Mojo::Reactor::Poll`](https://metacpan.org/source/Mojo::Reactor::Poll)
 ]
 
 - [`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
+
+![Thorns](img/thorn.jpg)
+
+## Watch out for the thorns...
+
+???
+There are some special considerations you need to take when writing event-driven code.
+
+---
+class: center, middle
+
+## Exceptions for error handling
+
+---
+class: center, middle
+
+### Problem: No exception handler up the call stack
+
+---
+class: ex-exceptions
+
+## Rule: Don't die/throw in event handlers.
+
+--
+### Error callback pattern
+
+```perl
+do_something_asynchronously(
+    callback => sub { ... },
+    on_error => sub { ... },
+);
+```
+
+---
+class: ex-exceptions
+
+## Rule: Don't die/throw in event handlers.
+
+### Use promises
+
+```perl
+my $promise = do_something_asynchronously();
+
+$promise->on_done(sub { ... });
+$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
 
 ---
 class: center, middle
 
This page took 0.022305 seconds and 4 git commands to generate.