Barrier
Source and Output
"""Example: barrier."""
from asimpy import Barrier, Environment, Process
from _util import example
NUM_WAITERS = 3 # number of waiting processes
class Waiter(Process):
def init(self, barrier, delay):
self._barrier = barrier
self._delay = delay
async def run(self):
await self.timeout(self._delay)
self._env.log(f"waiter {self._delay}", "waiting")
await self._barrier.wait()
self._env.log(f"waiter {self._delay}", "released")
class Releaser(Process):
def init(self, barrier, delay):
self._barrier = barrier
self._delay = delay
async def run(self):
await self.timeout(self._delay)
self._env.log("releaser", "releasing")
self._barrier.release()
def main():
env = Environment()
barrier = Barrier(env)
for i in range(NUM_WAITERS):
Waiter(env, barrier, i)
Releaser(env, barrier, NUM_WAITERS)
env.run()
return env
if __name__ == "__main__":
example(main)
| time | name | event |
|---|---|---|
| 0 | waiter 0 | waiting |
| 1 | waiter 1 | waiting |
| 2 | waiter 2 | waiting |
| 3 | releaser | releasing |
| 3 | waiter 0 | released |
| 3 | waiter 1 | released |
| 3 | waiter 2 | released |
Key Points
-
Waiterprocesses all arrive at the barrier before theReleaserreleases it. -
Barrier.release()is not anasyncoperation, soWaiterdoesn't release it.
Check for Understanding
What would happen to a Waiter that called barrier.wait() after it was released?