This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
A synchronization primitive, which allows you to wait for tasks to complete in order of completion. This is useful for implementing a task pool, where you want to wait for the first task to complete, and then cancel the rest.
|
||||
|
||||
If you try to wait for more things than you have added, you will deadlock.
|
||||
|
||||
## Example
|
||||
|
||||
~~~ ruby
|
||||
require 'async'
|
||||
require 'async/semaphore'
|
||||
require 'async/barrier'
|
||||
require 'async/waiter'
|
||||
|
||||
Sync do
|
||||
barrier = Async::Barrier.new
|
||||
waiter = Async::Waiter.new(parent: barrier)
|
||||
semaphore = Async::Semaphore.new(2, parent: waiter)
|
||||
|
||||
# Sleep sort the numbers:
|
||||
generator = Async do
|
||||
while true
|
||||
semaphore.async do |task|
|
||||
number = rand(1..10)
|
||||
sleep(number)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
numbers = []
|
||||
|
||||
4.times do
|
||||
# Wait for all the numbers to be sorted:
|
||||
numbers << waiter.wait
|
||||
end
|
||||
|
||||
# Don't generate any more numbers:
|
||||
generator.stop
|
||||
|
||||
# Stop all tasks which we don't care about:
|
||||
barrier.stop
|
||||
|
||||
Console.info("Smallest", numbers)
|
||||
end
|
||||
~~~
|
||||
|
||||
### Output
|
||||
|
||||
~~~
|
||||
0.0s info: Smallest
|
||||
| [3, 3, 1, 2]
|
||||
~~~
|
||||
Reference in New Issue
Block a user