Pond is a Crystal implementation of a WaitGroup, without channels or explicit counters. Pond automatically keeps track of all its fibers, and waits until all of them complete execution.
-
Add the dependency to your
shard.yml
:dependencies: pond: github: GrottoPress/pond
-
Run
shards install
-
Spawn fibers and wait on them:
require "pond" pond = Pond.new 1000.times do |_| pond.fill { do_work } # <= Spawns fiber and passes block to it end pond.drain # <= Waits for fibers to complete
The code above is the same as:
require "pond" Pond.drain do |pond| 1000.times do |_| pond.fill { do_work } end end # <= Drains pond automatically at the end of the block
-
You may spawn nested fibers:
In this case, all ancestor fibers have to be added to the pond, otherwise Pond can't guarantee any of them would complete.
require "pond" pond = Pond.new pond.fill do pond.fill do pond.fill { do_work } end end pond.drain
Note that, while you can fill a pond that was created in a another fiber, draining has to be done in the same fiber the pond was created in. This is to prevent potential deadlocks.
require "pond" pond = Pond.new pond.fill { do_work } spawn { pond.drain } # <= Error!
Run tests with crystal spec -Dpreview_mt
. You may set CRYSTAL_WORKERS
environment variable with export CRYSTAL_WORKERS=<number>
, before running tests.
- Fork it
- Switch to the
master
branch:git checkout master
- Create your feature branch:
git checkout -b my-new-feature
- Make your changes, updating changelog and documentation as appropriate.
- Commit your changes:
git commit
- Push to the branch:
git push origin my-new-feature
- Submit a new Pull Request against the
GrottoPress:master
branch.