ColdFusion Summit Notes: Sync or Async the Aha Moment - Shirak Avakian
October 15, 2018
understanding sync/async
Synchronous - the operation blocks a process until the operation completes
runs “line by line”
validate()
sendEmail()
saveToDatabase()
Asynchronous - non-blocking
only INITIATE the operation
validate()
— > sendEmail()
saveToDatabase()
sendEmail runs in “parallel mode” at same time as the other code
problem w/long running operations
blocking - when the thread is busy doing its stuff
blocking the processor of your application
when you dispatch an event, there’s a running process
between the running process, until it comes back to whatever initiated the request
that’s the “blocking” part
by the time you get the reply back, that’s the “unblocked” version
in async programming
you want to eliminate the blocking as much as possible
turn 1 chunk into multiple chunks to eliminate blocks
2 types of blocking
1. CPU bound blocking operations (math ops, games, etc)
90% of games rely on async programming
hardware system needs to support async programming
2. IO-bound (in/out) blocking operations. When your code is relying on external resources:
-hard drive / folder / file system / API calls
-network access
Demo: do a call to an API/query in-line and do one 1 runAsync with the “please wait” on the screen
async - run and forget
need to use judgement - when to use “wait”
any logging systems, really we’re not waiting for those results. put them in async mode.
sending email - async
saving stuff to a DB that the UI is NOT relying on - use async
do not use async:
-for simple and basic computations or short running operations
-when you have a single db server not utilizing connection pooling
if you run multiple async procs that talk to the database, updating, deleting, etc, that’s a bottleneck - db will have locking issues. so make sure your database supports “clustering” to get around this
for sequential tasks, where stopping the entire program to wait for a network request or disk i/o makes sense
-if your page is relying on results from a query before it can complete, you don’t gain anything with async
use async:
to make your client application really responsive
5 seconds is “late”
mobile apps, if it takes more than 5 seconds to load, people think the app isn’t working
if you want to make your web app responsive, async
when you can run multiple code blocks in parallel
when you’re interacting w/ an external service provider (API’s, etc)
when you have tasks independent from each other
2 types of async programming
1. client
2. server
client side is visible
you can “feel” it happen
$.ajax( url, async:true );
“async” and “await” keywords in JavaScript
async by itself = run and forget
async / await = let’s you do things when the request is finished
improves performance
data dependency is assured by using the “await” keyword
Asnc for server applications
new in CF2018
server applications , normally happened in blind box
interacting w/ database, file manager, emails, etc
CF provides RunAsync()
cfthread
event gateway
both also async
so why runAsync()?
cfthread - not always easy to manage, or to catch errors, confusing to join threads w/ cfthread
thread scope and attributes scopes are confusing, not very well documented, not many REAL examples out there!
runAsync returns a “future object”
“futures”
an eventual result of an async operation
can run as async mode or as async/await to get results back
methods for ruynAsync:
cancel
error
error( callback, timeout )
error( callback )
get
get( timeout )
is canceled
isdone()
then( callback)
then( callback, timeout )
* any time you use future object, your page thread will wait for the async result
future = runAsync()
creates a new thread separate from the main thread
runAsync( thing ).then( second thing ).then( third thing ).error( onError );
chained functions
they fire in order
error() runs if ANY of the threads throw an error
what if you want to run the error() also asynchronously? so you don’t see the error but it gets logged for later
onError() is not yet non-blocking, this is coming in an future (ha!) update
Cancel()
IsCanceled()
IsDone()
in try/catch, use “continue” to indicate “i will take care of this error, the rest of the app should just continue on as normal”.