orange—Client side concurrencymade simple
View Slide
rubysauna.org
heartrate.js
Concurrency
A B C
ABC
Concurrencyis hard
Barberzz
BarberCustomerzzSleeping?
BarberCustomer
BarberCustomerWorking?
Barber
Barber Customer?
Barber CustomerCrap.
BarberzzCrap.
Concurrencyin the browser
JavaScriptand the golden thread
foo()10ms 20ms 30ms 40msclick handledclick firedsetInterval (10ms)
Synchronous—vs—Asynchronous
WebWorkers
JavaScript Thread Worker
WorkerJavaScript Thread
WorkerWorkerJavaScript Thread
Dedicated, Shared &Inline Workers
orange
The queue
Define a worker
# workers/sum.coffeeimportScripts 'orange/worker.js'perform (data)->data.numbers.reduce (a, b)-> a + b
Create a new job
job = new Orange.Job('sum', numbers: [1..100])
job = new Orange.Job('sum', numbers: [1..100])job.on 'success', (response) ->console.log('Sum', response)job.perform()
Events
job.on 'success', (response)->job.on 'complete', ->job.on 'error', (error)->job.on 'failure', (error)->
Logging
# workers/sum.coffeeimportScripts 'orange/worker.js'perform (data)->log 'The background worker Gotham deserves ...'data.numbers.reduce (a, b) ->a + b
Batches
batch = new Orange.Batch
batch = new Orange.Batchjob = new Orange.Job('sum', [1..100])batch.push jobbatch.perform()
batch = new Orange.Batch [job1, job2, job3]
batch.on 'complete', (jobs) ->batch.on 'job:success', (job) ->batch.on 'job:complete', (job)->batch.on 'job:error', (job) ->batch.on 'job:failure', (job) ->
job.getResponse()job.getLastError()
Configuration
Orange.Config.setmaxWorkerPoolSize: 4maxRetries : 3workersPath : '/lib/workers/'
Retry mechanismand exponential back–off
Error handling
job.on 'error', (error)->throw errorBatchStateTransitionErrorJobStateTransitionErrorResponderNotFoundError…
Roadmap>0.2.0
Customized Worker ShimTest coverageData serializationBenchmarking
Forward arbitrary methodcalls to worker?Custom events?Instrumentation?Inline Workers?Helper modules?
Kiitos!
@polarblau