Step 2 - Multiple Coroutines¶
Lets take a look at a call flow calling multiple coroutines concurrently.
def generator():
# do something
yield # something
# do something else
yield # something else
# do another thing
return # some value
def other_generator():
# do something
yield # something
# do something else
return # other value
gen1 = generator()
next(gen1)
gen2 = other_generator()
next(gen1)
next(gen2)
try:
next(gen1)
except StopIteration as e:
some_value = e.value
try:
next(gen2)
except StopIteration as e:
other_value = e.value
sequenceDiagram
participant c as Caller
participant g1 as Generator
participant g2 as Other Generator
activate c
activate c
c->>g1: send/next
deactivate c
activate g1
activate g1
g1-->>c: yield
deactivate g1
activate c
c->>g2: send/next
deactivate c
activate g2
activate g2
g2-->>c: yield
deactivate g2
activate c
c->>g1: send/next
deactivate c
activate g1
g1-->>c: yield
deactivate g1
activate c
c->>g1: send/next
deactivate c
activate g1
g1->>c: return/StopIteration
deactivate g1
deactivate g1
activate c
c->>g2: send/next
deactivate c
activate g2
g2->>c: return/StopIteration
deactivate g2
deactivate g2
deactivate c
Summary
The caller can use several coroutines concurrently.
The caller is in control which coroutine and when a coroutine is resumed.
The caller needs to catch the
StopIteration
exception of each coroutine to get the return values.