libuv: cross platform asynchronous i/o

19
libuv Cross platform asynchronous i/o Saúl Ibarra Corretgé — @saghul

Upload: saul-ibarra-corretge

Post on 14-Feb-2017

138 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: libuv: cross platform asynchronous i/o

libuvCross platform asynchronous i/o

Saúl Ibarra Corretgé — @saghul

Page 2: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

LIBUV

▸ Cross-platform async I/O and more

▸ Small (relatively) C library: ~30K LOC (without tests)

▸ Extensive test suite and CI coverage

▸ Designed for C programs that miss the joy of JavaScript callback hell

▸ Used by many projects:https://github.com/libuv/libuv/wiki/Projects-that-use-libuv

Page 3: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

LIBUV: FEATURES

▸ Event loop

▸ Timers

▸ TCP / UDP sockets

▸ Named pipes

▸ Filesystem operations

▸ Signal handling

▸ Child processes

▸ ANSI escaped TTY

▸ Threading utilities

▸ Coolest logo ever

Page 4: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

LIBUV: ARCHITECTURE

▸ The event loop: uv_loop_t

▸ Handles: uv_handle_t

▸ Requests: uv_req_t

▸ Other utilities

Page 5: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

LIBUV: ARCHITECTURE

OPERATING SYSTEM

NETWORK I/O FILE I/O OTHER STUFF OS INDEPENDENT STUFF

Page 6: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

LIBUV ARCHITECTURE: NETWORK I/O

OPERATING SYSTEM

UV_TCP_T UV_PIPE_T UV_TTY_T

UV_UDP_T UV_POLL_TUV_STREAM_T

UV__IO_T (UNIX ONLY)

Page 7: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

LIBUV ARCHITECTURE: FILE I/O

UV_FS_T UV_GETADDRINFO_T UV_GETNAMEINFO_T

UV__WORK_T

THREAD POOL

UV_WORK_T

Page 8: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

LIBUV: A WORD ON THREADS

▸ We only use threads for file i/o and getaddrinfo

▸ http://blog.libtorrent.org/2012/10/asynchronous-disk-io/

▸ Default thread pool size is 4(runtime env var: UV_THREADPOOL_SIZE)

▸ NOT FOR NETWORK I/O

▸ NOT FOR NETWORK I/O

▸ NOT FOR NETWORK I/O

Page 9: libuv: cross platform asynchronous i/o

THE LIBUV EVENT LOOP IS SINGLE THREADED. THE THREAD POOL IS ONLY USED FOR FILE I/O.

The libuv police

CROSS PLATFORM ASYNCHRONOUS I/O

Page 10: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

LIBUV ARCHITECTURE: OTHER

▸ OS independent

▸ uv_timer_t

▸ uv_idle_t, uv_prepare_t, uv_check_taka “loop watchers”

▸ The thread pool

▸ OS dependent

▸ uv_signal_t

▸ uv_process_t

▸ Threading and miscellaneous utilities

Page 11: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

LIBUV: THE EVENT LOOP

Page 12: libuv: cross platform asynchronous i/o

libuv in Node

Page 13: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

NODE EVENT LOOP

Coalesced, 1 Node timer != 1 libuv timer

Run on a check + idle handleNext tick callbacks run from

node::MakeCallback

Page 14: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

ONION ARCHITECTURE (TM)net.Socket

TCPWrap

uv_tcp_t

Socket._handle

TCPWrap.handle_

fd / HANDLE

Page 15: libuv: cross platform asynchronous i/o

A CHAT APP, OF COURSE

Page 16: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

SAMPLE: A LIBUV CHAT APPLICATION

▸ Simple TCP server application

▸ A twist on libuv-chat by Ben Noordhuis in 2011

▸ Multiple users, single “chat room”

▸ Pokemon, because why not?

▸ https://github.com/saghul/libuv-chat

Page 17: libuv: cross platform asynchronous i/o

WHEN THERE IS SOMETHING STRANGE IN YOUR EVENT LOOP

Page 18: libuv: cross platform asynchronous i/o

CROSS PLATFORM ASYNCHRONOUS I/O

WHO YOU GONNA CALL? @LIBUV/COLLABORATORS

▸ @piscisaureus

▸ @bnoordhuis

▸ @indutny

▸ @saghul

▸ @cjihrig

▸ @iWuzHere

▸ @santigimeno

Page 19: libuv: cross platform asynchronous i/o

RESOURCES

libuv.org docs.libuv.org #libuv on IRC

libuv Google Group #libuv on StackOverflow