SlideShare a Scribd company logo
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 1/37
Concurrency Patterns
26 May 2015
Aaron Schlesinger
Sr. Engineer, Iron.io
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 2/37
About me
Database & backend systems engineer at Iron.io
Writing Go for ~2 yrs, JVM for a while during/before that
Distributed systems at Zynga, StackMob, PayPal, now Iron.io
C -> C++ -> Python/PHP -> Java -> Scala -> Go
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 3/37
"It's almost too easy to write concurrency bugs in Go"
Because Go has powerful concurrency primitives.
I'm discussing today how to use them responsibly.
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 4/37
Today
Conventions & patterns for:
sync.Mutex, chanand sync.WaitGroup
Timeouts(http://blog.golang.org/go-concurrency-patterns-timing-out-and), cancellation and net.Context
(http://godoc.org/golang.org/x/net/context)
For-select loops
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 5/37
Something old
Locks have a time and a place. We found a few at Iron.io (building a distributed DB).
If you use locks:
But prefer sharing memory by communicating.
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 6/37
Go-specific conventions
deferunlocking wherever possible
Document ownership in your public interface
Abstract mutual exclusion if it crosses an exported func
Worth paying attention to conventions from other communities (e.g. lock acquisition
order).
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 7/37
Documenting Mutual Exclusion
packagemain
import"errors"
varErrNotReserved=errors.New("notreserved")
//Reserverisamap[string]interface{}whereeachkey/valuepair
//canbereservedbycallersformutuallyexclusiveread-modify-write
//operations.
typeReserverinterface{
//GetAndReservewaitsforthekeytobeunreserved,thenreservesitformutualexclusion.
//Onsuccess,returnsthecurrentstateandreservationID.Usethelatterin
//futurecallsthatrequireareservationID.Ifanon-nilerrorisreturned,no
//reservationisestablishedandthereturnedvalueandreservationIDareinvalid.
GetAndReserve(keystring)(valinterface{},reservationIDstring,errerror)
//SetReservedsetsthevalueofthegivenkeyifreservationIDisvalid
//andpointstothecurrentreservation.Afterthiscallreturnssuccessfully,
//thecallerdoesn'thaveownershipofkeyandreservationIDisinvalid.
//ReturnsErrNotReservedifthereservationIDisinvalidornotthecurrentreservation.
//Onanynon-nilerror,neitherthevaluenorthecurrentreservationarechanged.
SetReserved(key,reservationIDstring,valueinterface{})error
}
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 8/37
Channels
Sharememorybycommunicating.
Channels + goroutines are "easy" but powerful enough to build real systems
They're built in for a reason. Use them by default
When in doubt, ask why you shouldn't use them to communicate between
goroutines
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 9/37
Conventions for Channels
Document sends and receives across funcboundaries: who and how?
Enlist the compiler. Use directional channels
Don't return a chanunless the funcis a generator(https://talks.golang.org/2012/concurrency.slide#25)
closeis a useful signal to callers. Use it and document it
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 10/37
Example
packagemain
import"sync"
//WatchChangeswillwatchthestateofthegivenrequest.chwillsendafter
//eachrequeststatechangeandwillbeclosedaftertherequestisremovedfrom
//therequeststatedatabase.Sendsonchfromthesamegoroutineasthecaller.
//
//ReturnsErrNotFoundiftherequestisnotreservedatcalltime.
//WatchChangeswilldonooperationsonchifanynon-nilerrorisreturned.
funcWatchChanges(reqIDstring,chchan<-int)error
//WatchAllwatchesforalleventsonthegivenrequest.
//
//TheWaitGroupwillbedoneaftertherequestisreserved,andthechannel
//willsendoneachstatechange,thenbeclosedwhentherequestisreleased.
//
//Thechannelwillsendfromanew,internalgoroutine,whichyouarenotresponsible
//formanaging.
funcWatchAll(reqIDstring)(*sync.WaitGroup,<-chanint)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 11/37
On Documentation
Documentation may establish contracts or invariants that code can't or won't
Code should be as self-documenting as possible, but don't let Godoc be empty
The remainder of this talk has mostly runnable code
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 12/37
WaitGroup
If you're waiting for a chanto close or receive a struct{}, can you use a
sync.WaitGroupinstead?
Use these as:
Notifiers for one-time events
Rendezvous points
Helpers to write deterministic tests
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 13/37
Notification of an event
packagemain
import"sync"
//startLoopstartsaloopinagoroutine.thereturnedWaitGroupisdone
//afterthefirstloopiterationhasstarted
funcstartLoop(nint)*sync.WaitGroup{
varwgsync.WaitGroup
wg.Add(1)
gofunc(){
first:=true
for{
//dosomeworkhere
iffirst{
wg.Done()
first=false
}
}
}()
return&wg
}
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 14/37
Revisiting fan-in
(Taken from https://talks.golang.org/2012/concurrency.slide#28
(https://talks.golang.org/2012/concurrency.slide#28), credit Renée French)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 15/37
Why?
If you can do work concurrently, do it. There's no excuse not to.
How I'm defining fan-in:
A code pattern to gather results from 2 or more goroutines
An algorithm to follow for converting sequential code to concurrent
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 16/37
Details
Read about it under "Fan-out, fan-in" section at https://blog.golang.org/pipelines
(https://blog.golang.org/pipelines)
sync.WaitGroupand a few channels make fan-in simple & understandable
In many cases, you can get an easy latency win without changing an exported func
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 17/37
Sequential datastore queries
funcGetAll()[]int{
ints:=make([]int,10)
fori:=0;i<10;i++{
ints[i]=datastoreGet()//sleepsfor<=1sec,thenreturnsarandomint
}
returnints
} Run
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 18/37
Concurrent datastore queries
funcGetAll()[]int{
wg,ch:=getWGAndChan(10)//getawaitgroupthathas10addedtoit,andachanint
fori:=0;i<10;i++{
c:=make(chanint)
godatastoreGet(c) //sendsanintoncthenclosesaftersleeping<=1sec
gofunc(){
deferwg.Done()//markthisiterationdoneafterreceivingonc
ch<-<-c //enhancement:rangeofcif>1results
}()
}
gofunc(){
wg.Wait()//waitforalldatastoreGetstofinish
close(ch)//thenclosethemainchannel
}()
ints:=make([]int,10)
i:=0
forres:=rangech{//streamallresultsfromeachdatastoreGetintotheslice
ints[i]=res//GetAllcanbeageneratorifyou'rewillingtochangeAPI.
i++ //thatletsyoupushresultsbacktothecaller.
}
returnints
} Run
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 19/37
Production issues
Specifically, issues in long-running systems.
They will happen
Test for them
Even if you can't, be proactive and try to fail gracefully
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 20/37
Timeouts
Your system shouldn't grind to a halt on channel sends.
Select on the channel and a timer. Or, do better...
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 21/37
Use net.Context
net.Context(https://blog.golang.org/context)has a nice interface in front of timers.
I'm cheating here. I said everything would be done with the standard library
Contexts are more than a timer. They provide a nice interface with some extras
You could build and test your own context in a few hours, from the stdlib
That's my excuse
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 22/37
Context interface
With (excellent) comments taken out for brevity.
import"time"
typeContextinterface{
Deadline()(deadlinetime.Time,okbool)
Done()<-chanstruct{}
Err()error
Value(keyinterface{})interface{}
}
(Copyright (c) 2009 The Go Authors. All rights reserved. Please see the full license
(https://github.com/golang/net/blob/master/LICENSE)for more.)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 23/37
Using contexts
They add cancellation
They build a tree of control
net.Contextis a good universal tool for timeouts/cancellation in a large codebase.
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 24/37
Contexts in a distributed system
The Tail at Scale.
Jeff Dean talk/paper. I originally saw it at a Ricon 2013 Talk(https://www.youtube.com/watch?v=C_PxVdQmfpk)
Hedged requests: do a few identical GET (e.g. no side effects) requests, cancel
remaining requests after first returns
Rob showed a variant in https://talks.golang.org/2012/concurrency.slide#50
(https://talks.golang.org/2012/concurrency.slide#50)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 25/37
Adding cancellation
funcmain(){
ch:=make(chanint)
ctx,cancel:=context.WithTimeout(context.Background(),10*time.Millisecond)
defercancel()
fori:=0;i<10;i++{
//getsleepsforarandomduration<=100ms,
//thensendsarandomintonch.stopsifctx.Done()receives.
goget(ctx,ch)
}
select{
casei:=<-ch:
fmt.Printf("gotresult%dn",i)
case<-ctx.Done():
fmt.Println("gotnoresult")
}
} Run
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 26/37
That was the naïve implementation
But, it's not too hard to get "fancy"
Don't send 2nd request until 1st is past 95th percentile expected latency (2
contexts - one cancel)
Cancel in-flight requests (pass context to RPC subsystem)
Target-target communication (pass info on other in-flight requests over RPC)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 27/37
Putting it all together
For-select loops put together almost all of the concepts in here.
Possible applications:
Event loops
GC
Sequential state mutation (like an actor)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 28/37
For-select loop mechanics
Run a (possibly infinite) loop in a goroutine
Generally select on 2+ channels in each iteration
Sometimes pass long running operations to other goroutines
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 29/37
Patterns
Ack before and after real work is done. testing is easier and rate
limiting/backpressure is easy
If you're ticking, wrap time.Tickerto add ack
net.Contextfor cancellation
sync.WaitGroupfor started and stopped
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 30/37
A for-select poller
funcpoll(ctxcontext.Context)(*sync.WaitGroup,*sync.WaitGroup,<-chanstring){
varstart,endsync.WaitGroup//start&endnotificationstomultipleparties
start.Add(1)
end.Add(1)
ch:=make(chanstring)
gofunc(){
deferclose(ch)
deferend.Done()
start.Done()
for{
time.Sleep(5*time.Millisecond)
select{
case<-ctx.Done():
return
casech<-"element"+strconv.Itoa(rand.Int()):
}
}
}()
return&start,&end,ch
}
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 31/37
Driving the poller
funcmain(){
ctx,cancel:=context.WithTimeout(context.Background(),10*time.Millisecond)
defercancel()
mainCh,wg:=makeThings(10)//makeachanstringandawgthathas10addedtoit
fori:=0;i<10;i++{
start,_,ch:=poll(ctx)
start.Wait()
gofunc(){
deferwg.Done()
forstr:=rangech{
mainCh<-str
}
}()
}
gofunc(){
wg.Wait()
close(mainCh)
}()
printCh(mainCh)//loopsonmainChuntilit'sclosed
} Run
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 32/37
Notes
The poller is missing the ack
We have a small utility at Iron.io to add acks to time.Tickerand time.Timer
Exercise left to the reader
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 33/37
Conclusion
Go has really good built in concurrency primitives.
I believe we (the community) are starting to build good patterns & tools to responsibly
build on them.
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 34/37
If you take one thing away
Use net.Contextin your codebase.
Or, at least try it.
It's simple and powerful, and follows the "Go way."
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 35/37
If you take two things away
Add reading and understanding Go Concurrency Patterns(https://talks.golang.org/2012/concurrency.slide).
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 36/37
Thank you
Aaron Schlesinger
Sr. Engineer, Iron.io
aaron@iron.io(mailto:aaron@iron.io)
http://github.com/arschles(http://github.com/arschles)
@arschles(http://twitter.com/arschles)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 37/37

More Related Content

What's hot

2012 04-19 theory-of_operation
2012 04-19 theory-of_operation2012 04-19 theory-of_operation
2012 04-19 theory-of_operation
bobwolff68
 
Golang 101
Golang 101Golang 101
Golang 101
宇 傅
 
Composer
ComposerComposer
Composer
Nils Adermann
 
Porting and Maintaining your C++ Game on Android without losing your mind
Porting and Maintaining your C++ Game on Android without losing your mindPorting and Maintaining your C++ Game on Android without losing your mind
Porting and Maintaining your C++ Game on Android without losing your mind
BeMyApp
 
Os Leventhal
Os LeventhalOs Leventhal
Os Leventhal
oscon2007
 
Performance tips for Symfony2 & PHP
Performance tips for Symfony2 & PHPPerformance tips for Symfony2 & PHP
Performance tips for Symfony2 & PHP
Max Romanovsky
 
Composer (PHP Usergroup Karlsruhe)
Composer (PHP Usergroup Karlsruhe)Composer (PHP Usergroup Karlsruhe)
Composer (PHP Usergroup Karlsruhe)
Nils Adermann
 
Makefile for python projects
Makefile for python projectsMakefile for python projects
Makefile for python projects
Mpho Mphego
 
Real-Time Web applications with WebSockets
Real-Time Web applications with WebSocketsReal-Time Web applications with WebSockets
Real-Time Web applications with WebSockets
Stanislav Zozulia
 
Javaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingJavaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 Groovytesting
Andres Almiray
 
Digibury: Edd Barrett - A Case Study in Cross-Language Tracing
Digibury: Edd Barrett - A Case Study in Cross-Language TracingDigibury: Edd Barrett - A Case Study in Cross-Language Tracing
Digibury: Edd Barrett - A Case Study in Cross-Language Tracing
Lizzie Hodgson
 
Javaone2008 Bof 5102 Groovybuilders
Javaone2008 Bof 5102 GroovybuildersJavaone2008 Bof 5102 Groovybuilders
Javaone2008 Bof 5102 Groovybuilders
Andres Almiray
 
[COSCUP 2020] How to use llvm frontend library-libtooling
[COSCUP 2020] How to use llvm frontend library-libtooling[COSCUP 2020] How to use llvm frontend library-libtooling
[COSCUP 2020] How to use llvm frontend library-libtooling
Douglas Chen
 
Os Ramirez
Os RamirezOs Ramirez
Os Ramirez
oscon2007
 
The Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and EverythingThe Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and Everything
Andrey Karpov
 
The Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and EverythingThe Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and Everything
PVS-Studio
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
Rowan Merewood
 
Tensorflow on Android
Tensorflow on AndroidTensorflow on Android
Tensorflow on Android
Koan-Sin Tan
 
Stopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestStopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under Test
Seb Rose
 
Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepo
Puppet
 

What's hot (20)

2012 04-19 theory-of_operation
2012 04-19 theory-of_operation2012 04-19 theory-of_operation
2012 04-19 theory-of_operation
 
Golang 101
Golang 101Golang 101
Golang 101
 
Composer
ComposerComposer
Composer
 
Porting and Maintaining your C++ Game on Android without losing your mind
Porting and Maintaining your C++ Game on Android without losing your mindPorting and Maintaining your C++ Game on Android without losing your mind
Porting and Maintaining your C++ Game on Android without losing your mind
 
Os Leventhal
Os LeventhalOs Leventhal
Os Leventhal
 
Performance tips for Symfony2 & PHP
Performance tips for Symfony2 & PHPPerformance tips for Symfony2 & PHP
Performance tips for Symfony2 & PHP
 
Composer (PHP Usergroup Karlsruhe)
Composer (PHP Usergroup Karlsruhe)Composer (PHP Usergroup Karlsruhe)
Composer (PHP Usergroup Karlsruhe)
 
Makefile for python projects
Makefile for python projectsMakefile for python projects
Makefile for python projects
 
Real-Time Web applications with WebSockets
Real-Time Web applications with WebSocketsReal-Time Web applications with WebSockets
Real-Time Web applications with WebSockets
 
Javaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingJavaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 Groovytesting
 
Digibury: Edd Barrett - A Case Study in Cross-Language Tracing
Digibury: Edd Barrett - A Case Study in Cross-Language TracingDigibury: Edd Barrett - A Case Study in Cross-Language Tracing
Digibury: Edd Barrett - A Case Study in Cross-Language Tracing
 
Javaone2008 Bof 5102 Groovybuilders
Javaone2008 Bof 5102 GroovybuildersJavaone2008 Bof 5102 Groovybuilders
Javaone2008 Bof 5102 Groovybuilders
 
[COSCUP 2020] How to use llvm frontend library-libtooling
[COSCUP 2020] How to use llvm frontend library-libtooling[COSCUP 2020] How to use llvm frontend library-libtooling
[COSCUP 2020] How to use llvm frontend library-libtooling
 
Os Ramirez
Os RamirezOs Ramirez
Os Ramirez
 
The Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and EverythingThe Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and Everything
 
The Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and EverythingThe Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and Everything
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
 
Tensorflow on Android
Tensorflow on AndroidTensorflow on Android
Tensorflow on Android
 
Stopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestStopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under Test
 
Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepo
 

Viewers also liked

Concurrency Patterns
Concurrency PatternsConcurrency Patterns
Concurrency Patterns
melbournepatterns
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
Raquel Pau
 
Concurrency With Go
Concurrency With GoConcurrency With Go
Concurrency With Go
John-Alan Simmons
 
An introduction to programming in Go
An introduction to programming in GoAn introduction to programming in Go
An introduction to programming in Go
David Robert Camargo de Campos
 
Concurrent programming1
Concurrent programming1Concurrent programming1
Concurrent programming1
Nick Brandaleone
 
Go Concurrency
Go ConcurrencyGo Concurrency
Go Concurrency
jgrahamc
 
Beyond Relational
Beyond RelationalBeyond Relational
Beyond Relational
Lynn Langit
 

Viewers also liked (7)

Concurrency Patterns
Concurrency PatternsConcurrency Patterns
Concurrency Patterns
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Concurrency With Go
Concurrency With GoConcurrency With Go
Concurrency With Go
 
An introduction to programming in Go
An introduction to programming in GoAn introduction to programming in Go
An introduction to programming in Go
 
Concurrent programming1
Concurrent programming1Concurrent programming1
Concurrent programming1
 
Go Concurrency
Go ConcurrencyGo Concurrency
Go Concurrency
 
Beyond Relational
Beyond RelationalBeyond Relational
Beyond Relational
 

Similar to Concurrency patterns

Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Christian Catalan
 
Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)
Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)
Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)
VMware Tanzu
 
The value of reactive
The value of reactiveThe value of reactive
The value of reactive
Stéphane Maldini
 
The Value of Reactive
The Value of ReactiveThe Value of Reactive
The Value of Reactive
VMware Tanzu
 
2014 Joker - Integration Testing from the Trenches
2014 Joker - Integration Testing from the Trenches2014 Joker - Integration Testing from the Trenches
2014 Joker - Integration Testing from the Trenches
Nicolas Fränkel
 
Dead-Simple Async Control Flow with Coroutines
Dead-Simple Async Control Flow with CoroutinesDead-Simple Async Control Flow with Coroutines
Dead-Simple Async Control Flow with Coroutines
Travis Kaufman
 
Sprockets
SprocketsSprockets
Sprockets
Tim Novinger
 
Tempest scenariotests 20140512
Tempest scenariotests 20140512Tempest scenariotests 20140512
Tempest scenariotests 20140512
Masayuki Igawa
 
Continuous Integration using Cruise Control
Continuous Integration using Cruise ControlContinuous Integration using Cruise Control
Continuous Integration using Cruise Control
elliando dias
 
Azure from scratch part 4
Azure from scratch part 4Azure from scratch part 4
Azure from scratch part 4
Girish Kalamati
 
When Web Services Go Bad
When Web Services Go BadWhen Web Services Go Bad
When Web Services Go Bad
Steve Loughran
 
Le Tour de xUnit
Le Tour de xUnitLe Tour de xUnit
Le Tour de xUnit
Abdelmonaim Remani
 
Let's make this test suite run faster! SoftShake 2010
Let's make this test suite run faster! SoftShake 2010Let's make this test suite run faster! SoftShake 2010
Let's make this test suite run faster! SoftShake 2010
David Gageot
 
Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...
Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...
Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...
Cωνσtantίnoς Giannoulis
 
Spring boot microservice metrics monitoring
Spring boot   microservice metrics monitoringSpring boot   microservice metrics monitoring
Spring boot microservice metrics monitoring
Oracle Korea
 
Spring Boot - Microservice Metrics Monitoring
Spring Boot - Microservice Metrics MonitoringSpring Boot - Microservice Metrics Monitoring
Spring Boot - Microservice Metrics Monitoring
DonghuKIM2
 
Ephemeral DevOps: Adventures in Managing Short-Lived Systems
Ephemeral DevOps: Adventures in Managing Short-Lived SystemsEphemeral DevOps: Adventures in Managing Short-Lived Systems
Ephemeral DevOps: Adventures in Managing Short-Lived Systems
Priyanka Aash
 
Webinar: Agile Network Deployment
Webinar: Agile Network DeploymentWebinar: Agile Network Deployment
Webinar: Agile Network Deployment
VasudhaSridharan
 
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh VariaCloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Amazon Web Services
 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in Django
Kevin Harvey
 

Similar to Concurrency patterns (20)

Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
 
Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)
Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)
Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)
 
The value of reactive
The value of reactiveThe value of reactive
The value of reactive
 
The Value of Reactive
The Value of ReactiveThe Value of Reactive
The Value of Reactive
 
2014 Joker - Integration Testing from the Trenches
2014 Joker - Integration Testing from the Trenches2014 Joker - Integration Testing from the Trenches
2014 Joker - Integration Testing from the Trenches
 
Dead-Simple Async Control Flow with Coroutines
Dead-Simple Async Control Flow with CoroutinesDead-Simple Async Control Flow with Coroutines
Dead-Simple Async Control Flow with Coroutines
 
Sprockets
SprocketsSprockets
Sprockets
 
Tempest scenariotests 20140512
Tempest scenariotests 20140512Tempest scenariotests 20140512
Tempest scenariotests 20140512
 
Continuous Integration using Cruise Control
Continuous Integration using Cruise ControlContinuous Integration using Cruise Control
Continuous Integration using Cruise Control
 
Azure from scratch part 4
Azure from scratch part 4Azure from scratch part 4
Azure from scratch part 4
 
When Web Services Go Bad
When Web Services Go BadWhen Web Services Go Bad
When Web Services Go Bad
 
Le Tour de xUnit
Le Tour de xUnitLe Tour de xUnit
Le Tour de xUnit
 
Let's make this test suite run faster! SoftShake 2010
Let's make this test suite run faster! SoftShake 2010Let's make this test suite run faster! SoftShake 2010
Let's make this test suite run faster! SoftShake 2010
 
Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...
Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...
Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...
 
Spring boot microservice metrics monitoring
Spring boot   microservice metrics monitoringSpring boot   microservice metrics monitoring
Spring boot microservice metrics monitoring
 
Spring Boot - Microservice Metrics Monitoring
Spring Boot - Microservice Metrics MonitoringSpring Boot - Microservice Metrics Monitoring
Spring Boot - Microservice Metrics Monitoring
 
Ephemeral DevOps: Adventures in Managing Short-Lived Systems
Ephemeral DevOps: Adventures in Managing Short-Lived SystemsEphemeral DevOps: Adventures in Managing Short-Lived Systems
Ephemeral DevOps: Adventures in Managing Short-Lived Systems
 
Webinar: Agile Network Deployment
Webinar: Agile Network DeploymentWebinar: Agile Network Deployment
Webinar: Agile Network Deployment
 
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh VariaCloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in Django
 

Recently uploaded

04. Ruby Operators Slides - Ruby Core Teaching
04. Ruby Operators Slides - Ruby Core Teaching04. Ruby Operators Slides - Ruby Core Teaching
04. Ruby Operators Slides - Ruby Core Teaching
quanhoangd129
 
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
dream girl
 
Test Polarity: Detecting Positive and Negative Tests (FSE 2024)
Test Polarity: Detecting Positive and Negative Tests (FSE 2024)Test Polarity: Detecting Positive and Negative Tests (FSE 2024)
Test Polarity: Detecting Positive and Negative Tests (FSE 2024)
andrehoraa
 
02. Ruby Basic slides - Ruby Core Teaching
02. Ruby Basic slides - Ruby Core Teaching02. Ruby Basic slides - Ruby Core Teaching
02. Ruby Basic slides - Ruby Core Teaching
quanhoangd129
 
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
shanihomely
 
06. Ruby Array & Hash - Ruby Core Teaching
06. Ruby Array & Hash - Ruby Core Teaching06. Ruby Array & Hash - Ruby Core Teaching
06. Ruby Array & Hash - Ruby Core Teaching
quanhoangd129
 
Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...
kiara pandey
 
08. Ruby Enumerable - Ruby Core Teaching
08. Ruby Enumerable - Ruby Core Teaching08. Ruby Enumerable - Ruby Core Teaching
08. Ruby Enumerable - Ruby Core Teaching
quanhoangd129
 
A Step-by-Step Guide to Selecting the Right Automated Software Testing Tools.pdf
A Step-by-Step Guide to Selecting the Right Automated Software Testing Tools.pdfA Step-by-Step Guide to Selecting the Right Automated Software Testing Tools.pdf
A Step-by-Step Guide to Selecting the Right Automated Software Testing Tools.pdf
kalichargn70th171
 
Authentication Review-June -2024 AP & TS.pptx
Authentication Review-June -2024 AP & TS.pptxAuthentication Review-June -2024 AP & TS.pptx
Authentication Review-June -2024 AP & TS.pptx
DEMONDUOS
 
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
45unexpected
 
Fix Production Bugs Quickly - The Power of Structured Logging in Ruby on Rail...
Fix Production Bugs Quickly - The Power of Structured Logging in Ruby on Rail...Fix Production Bugs Quickly - The Power of Structured Logging in Ruby on Rail...
Fix Production Bugs Quickly - The Power of Structured Logging in Ruby on Rail...
John Gallagher
 
Amadeus Travel API, Amadeus Booking API, Amadeus GDS
Amadeus Travel API, Amadeus Booking API, Amadeus GDSAmadeus Travel API, Amadeus Booking API, Amadeus GDS
Amadeus Travel API, Amadeus Booking API, Amadeus GDS
aadhiyaeliza
 
BATber53 AWS Modernize your applications with purpose-built AWS databases
BATber53 AWS Modernize your applications with purpose-built AWS databasesBATber53 AWS Modernize your applications with purpose-built AWS databases
BATber53 AWS Modernize your applications with purpose-built AWS databases
BATbern
 
Fantastic Design Patterns and Where to use them No Notes.pdf
Fantastic Design Patterns and Where to use them No Notes.pdfFantastic Design Patterns and Where to use them No Notes.pdf
Fantastic Design Patterns and Where to use them No Notes.pdf
6m9p7qnjj8
 
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
902basic
 
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
revolutionary575
 
ERP Software Solutions Provider in Coimbatore
ERP Software Solutions Provider in CoimbatoreERP Software Solutions Provider in Coimbatore
ERP Software Solutions Provider in Coimbatore
Nextskill Technologies
 
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
rachitkumar09887
 
B.Sc. Computer Science Department PPT 2024
B.Sc. Computer Science Department PPT 2024B.Sc. Computer Science Department PPT 2024
B.Sc. Computer Science Department PPT 2024
vmsdeptcom
 

Recently uploaded (20)

04. Ruby Operators Slides - Ruby Core Teaching
04. Ruby Operators Slides - Ruby Core Teaching04. Ruby Operators Slides - Ruby Core Teaching
04. Ruby Operators Slides - Ruby Core Teaching
 
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
Russian Girls Call Mumbai 🛵🚡9833363713 💃 Choose Best And Top Girl Service And...
 
Test Polarity: Detecting Positive and Negative Tests (FSE 2024)
Test Polarity: Detecting Positive and Negative Tests (FSE 2024)Test Polarity: Detecting Positive and Negative Tests (FSE 2024)
Test Polarity: Detecting Positive and Negative Tests (FSE 2024)
 
02. Ruby Basic slides - Ruby Core Teaching
02. Ruby Basic slides - Ruby Core Teaching02. Ruby Basic slides - Ruby Core Teaching
02. Ruby Basic slides - Ruby Core Teaching
 
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
Russian Girls Call Mumbai 🎈🔥9930687706 🔥💋🎈 Provide Best And Top Girl Service ...
 
06. Ruby Array & Hash - Ruby Core Teaching
06. Ruby Array & Hash - Ruby Core Teaching06. Ruby Array & Hash - Ruby Core Teaching
06. Ruby Array & Hash - Ruby Core Teaching
 
Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9930687706 Unlimited Short Providing Girls Servic...
 
08. Ruby Enumerable - Ruby Core Teaching
08. Ruby Enumerable - Ruby Core Teaching08. Ruby Enumerable - Ruby Core Teaching
08. Ruby Enumerable - Ruby Core Teaching
 
A Step-by-Step Guide to Selecting the Right Automated Software Testing Tools.pdf
A Step-by-Step Guide to Selecting the Right Automated Software Testing Tools.pdfA Step-by-Step Guide to Selecting the Right Automated Software Testing Tools.pdf
A Step-by-Step Guide to Selecting the Right Automated Software Testing Tools.pdf
 
Authentication Review-June -2024 AP & TS.pptx
Authentication Review-June -2024 AP & TS.pptxAuthentication Review-June -2024 AP & TS.pptx
Authentication Review-June -2024 AP & TS.pptx
 
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
Celebrity Girls Call Mumbai 9920725232 Unlimited Short Providing Girls Servic...
 
Fix Production Bugs Quickly - The Power of Structured Logging in Ruby on Rail...
Fix Production Bugs Quickly - The Power of Structured Logging in Ruby on Rail...Fix Production Bugs Quickly - The Power of Structured Logging in Ruby on Rail...
Fix Production Bugs Quickly - The Power of Structured Logging in Ruby on Rail...
 
Amadeus Travel API, Amadeus Booking API, Amadeus GDS
Amadeus Travel API, Amadeus Booking API, Amadeus GDSAmadeus Travel API, Amadeus Booking API, Amadeus GDS
Amadeus Travel API, Amadeus Booking API, Amadeus GDS
 
BATber53 AWS Modernize your applications with purpose-built AWS databases
BATber53 AWS Modernize your applications with purpose-built AWS databasesBATber53 AWS Modernize your applications with purpose-built AWS databases
BATber53 AWS Modernize your applications with purpose-built AWS databases
 
Fantastic Design Patterns and Where to use them No Notes.pdf
Fantastic Design Patterns and Where to use them No Notes.pdfFantastic Design Patterns and Where to use them No Notes.pdf
Fantastic Design Patterns and Where to use them No Notes.pdf
 
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
Private Girls Call Navi Mumbai 🛵🚡9820252231 💃 Choose Best And Top Girl Servic...
 
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
Busty Girls Call Mumbai 9930245274 Unlimited Short Providing Girls Service Av...
 
ERP Software Solutions Provider in Coimbatore
ERP Software Solutions Provider in CoimbatoreERP Software Solutions Provider in Coimbatore
ERP Software Solutions Provider in Coimbatore
 
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
Agra Girls Call Agra 0X0000000X Unlimited Short Providing Girls Service Avail...
 
B.Sc. Computer Science Department PPT 2024
B.Sc. Computer Science Department PPT 2024B.Sc. Computer Science Department PPT 2024
B.Sc. Computer Science Department PPT 2024
 

Concurrency patterns