SlideShare ist ein Scribd-Unternehmen logo
1 von 37
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Was ist angesagt?

2012 04-19 theory-of_operation
2012 04-19 theory-of_operation2012 04-19 theory-of_operation
2012 04-19 theory-of_operationbobwolff68
 
Golang 101
Golang 101Golang 101
Golang 101宇 傅
 
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 mindBeMyApp
 
Os Leventhal
Os LeventhalOs Leventhal
Os Leventhaloscon2007
 
Performance tips for Symfony2 & PHP
Performance tips for Symfony2 & PHPPerformance tips for Symfony2 & PHP
Performance tips for Symfony2 & PHPMax 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 projectsMpho Mphego
 
Real-Time Web applications with WebSockets
Real-Time Web applications with WebSocketsReal-Time Web applications with WebSockets
Real-Time Web applications with WebSocketsStanislav Zozulia
 
Javaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingJavaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingAndres 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 TracingLizzie Hodgson
 
Javaone2008 Bof 5102 Groovybuilders
Javaone2008 Bof 5102 GroovybuildersJavaone2008 Bof 5102 Groovybuilders
Javaone2008 Bof 5102 GroovybuildersAndres 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-libtoolingDouglas Chen
 
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 EverythingAndrey 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 EverythingPVS-Studio
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy CodeRowan Merewood
 
Tensorflow on Android
Tensorflow on AndroidTensorflow on Android
Tensorflow on AndroidKoan-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 TestSeb Rose
 
Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet
 

Was ist angesagt? (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
 

Andere mochten auch

Andere mochten auch (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
 

Ähnlich wie 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 ReactiveVMware 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 TrenchesNicolas 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 CoroutinesTravis Kaufman
 
Tempest scenariotests 20140512
Tempest scenariotests 20140512Tempest scenariotests 20140512
Tempest scenariotests 20140512Masayuki Igawa
 
Continuous Integration using Cruise Control
Continuous Integration using Cruise ControlContinuous Integration using Cruise Control
Continuous Integration using Cruise Controlelliando dias
 
When Web Services Go Bad
When Web Services Go BadWhen Web Services Go Bad
When Web Services Go BadSteve Loughran
 
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 2010David 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 monitoringOracle Korea
 
Spring Boot - Microservice Metrics Monitoring
Spring Boot - Microservice Metrics MonitoringSpring Boot - Microservice Metrics Monitoring
Spring Boot - Microservice Metrics MonitoringDonghuKIM2
 
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 SystemsPriyanka Aash
 
Webinar: Agile Network Deployment
Webinar: Agile Network DeploymentWebinar: Agile Network Deployment
Webinar: Agile Network DeploymentVasudhaSridharan
 
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 VariaAmazon Web Services
 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in DjangoKevin Harvey
 

Ähnlich wie 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
 

Kürzlich hochgeladen

OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...Shane Coughlan
 
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456KiaraTiradoMicha
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is insideshinachiaurasa2
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfayushiqss
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...Nitya salvi
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...SelfMade bd
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfkalichargn70th171
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrainmasabamasaba
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisamasabamasaba
 
ManageIQ - Sprint 236 Review - Slide Deck
ManageIQ - Sprint 236 Review - Slide DeckManageIQ - Sprint 236 Review - Slide Deck
ManageIQ - Sprint 236 Review - Slide DeckManageIQ
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdfPearlKirahMaeRagusta1
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesVictorSzoltysek
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnAmarnathKambale
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
Pharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodologyPharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodologyAnusha Are
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 

Kürzlich hochgeladen (20)

OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456LEVEL 5   - SESSION 1 2023 (1).pptx - PDF 123456
LEVEL 5 - SESSION 1 2023 (1).pptx - PDF 123456
 
The title is not connected to what is inside
The title is not connected to what is insideThe title is not connected to what is inside
The title is not connected to what is inside
 
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdfThe Top App Development Trends Shaping the Industry in 2024-25 .pdf
The Top App Development Trends Shaping the Industry in 2024-25 .pdf
 
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...Chinsurah Escorts ☎️8617697112  Starting From 5K to 15K High Profile Escorts ...
Chinsurah Escorts ☎️8617697112 Starting From 5K to 15K High Profile Escorts ...
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdfPayment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
Payment Gateway Testing Simplified_ A Step-by-Step Guide for Beginners.pdf
 
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
%in Bahrain+277-882-255-28 abortion pills for sale in Bahrain
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa%in tembisa+277-882-255-28 abortion pills for sale in tembisa
%in tembisa+277-882-255-28 abortion pills for sale in tembisa
 
ManageIQ - Sprint 236 Review - Slide Deck
ManageIQ - Sprint 236 Review - Slide DeckManageIQ - Sprint 236 Review - Slide Deck
ManageIQ - Sprint 236 Review - Slide Deck
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
VTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learnVTU technical seminar 8Th Sem on Scikit-learn
VTU technical seminar 8Th Sem on Scikit-learn
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
Pharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodologyPharm-D Biostatistics and Research methodology
Pharm-D Biostatistics and Research methodology
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 

Concurrency patterns