From 5a968ac76c660f068d9d09764042f9447d91c227 Mon Sep 17 00:00:00 2001 From: Loic Nageleisen Date: Mon, 3 Aug 2015 13:50:05 +0200 Subject: [PATCH] examples --- examples/channel_buffering.rb | 11 ++++++++ examples/channel_directions.rb | 18 ++++++++++++ examples/channel_synchronization.rb | 15 ++++++++++ examples/channels.rb | 10 +++++++ examples/closing_channels.rb | 31 +++++++++++++++++++++ examples/many_to_one.rb | 15 ++++++++++ examples/non_blocking_channel_operations.rb | 30 ++++++++++++++++++++ examples/one_to_many.rb | 24 ++++++++++++++++ examples/range_over_channels.rb | 10 +++++++ examples/select.rb | 25 +++++++++++++++++ examples/timeout.rb | 30 ++++++++++++++++++++ 11 files changed, 219 insertions(+) create mode 100644 examples/channel_buffering.rb create mode 100644 examples/channel_directions.rb create mode 100644 examples/channel_synchronization.rb create mode 100644 examples/channels.rb create mode 100644 examples/closing_channels.rb create mode 100644 examples/many_to_one.rb create mode 100644 examples/non_blocking_channel_operations.rb create mode 100644 examples/one_to_many.rb create mode 100644 examples/range_over_channels.rb create mode 100644 examples/select.rb create mode 100644 examples/timeout.rb diff --git a/examples/channel_buffering.rb b/examples/channel_buffering.rb new file mode 100644 index 0000000..8160dc1 --- /dev/null +++ b/examples/channel_buffering.rb @@ -0,0 +1,11 @@ +# https://gobyexample.com/channel_buffering + +require 'channel' + +messages = Channel.new(2) + +messages << 'buffered' +messages << 'channel' + +puts messages.recv +puts messages.recv diff --git a/examples/channel_directions.rb b/examples/channel_directions.rb new file mode 100644 index 0000000..1df5034 --- /dev/null +++ b/examples/channel_directions.rb @@ -0,0 +1,18 @@ +# https://gobyexample.com/channel-directions + +require 'channel' + +def ping(pings, msg) + pings << msg +end + +def pong(pings, pongs) + msg = pings.recv + pongs << msg +end + +pings = Channel.new(1) +pongs = Channel.new(1) +ping(pings, 'passed message') +pong(pings, pongs) +puts pongs.recv diff --git a/examples/channel_synchronization.rb b/examples/channel_synchronization.rb new file mode 100644 index 0000000..61c29e8 --- /dev/null +++ b/examples/channel_synchronization.rb @@ -0,0 +1,15 @@ +# https://gobyexample.com/channel-synchronization + +require 'channel' + +def worker(done) + puts 'working...' + sleep 1 + puts 'done' + done << true +end + +done = Channel.new(1) +go -> { worker(done) } + +done.recv diff --git a/examples/channels.rb b/examples/channels.rb new file mode 100644 index 0000000..09289bb --- /dev/null +++ b/examples/channels.rb @@ -0,0 +1,10 @@ +# https://gobyexample.com/channels + +require 'channel' + +messages = Channel.new + +go -> { messages << 'ping' } + +msg = messages.recv +puts msg diff --git a/examples/closing_channels.rb b/examples/closing_channels.rb new file mode 100644 index 0000000..ba2668f --- /dev/null +++ b/examples/closing_channels.rb @@ -0,0 +1,31 @@ +# https://gobyexample.com/closing-channels + +require 'channel' + +jobs = Channel.new(5) +done = Channel.new + +go lambda { + loop do + begin + j = jobs.recv + rescue Channel::Closed + # TODO: wrong! ends before all items recv'd + # j, more := <-jobs; more == True + puts 'received all jobs' + done << true + return + else + puts "received job #{j}" + end + end +} + +3.times do |j| + jobs << j + puts "sent job #{j}" +end +jobs.close +puts 'sent all jobs' + +done.recv diff --git a/examples/many_to_one.rb b/examples/many_to_one.rb new file mode 100644 index 0000000..22789a0 --- /dev/null +++ b/examples/many_to_one.rb @@ -0,0 +1,15 @@ +# http://stackoverflow.com/questions/15715605/multiple-goroutines-listening-on-one-channel + +require 'channel' + +c = Channel.new + +1.upto(5) do |i| + go(lambda { |i, co| + 1.upto(5) do |j| + co << format("hi from %d.%d", i, j) + end + }, i, c) +end + +25.times { puts c.recv } diff --git a/examples/non_blocking_channel_operations.rb b/examples/non_blocking_channel_operations.rb new file mode 100644 index 0000000..dadf5be --- /dev/null +++ b/examples/non_blocking_channel_operations.rb @@ -0,0 +1,30 @@ +# https://gobyexample.com/non-blocking-channel-operations + +require 'channel' + +messages = Channel.new +signals = Channel.new + +Channel.select(messages) do |msg, c| + case c + when messages then puts "received message #{msg}" + else puts 'no message received' + end +end + +msg = 'hi' +messages <- msg +#select { +#case messages <- msg: +# fmt.Println("sent message", msg) +#default: +# fmt.Println("no message sent") +#} + +Channel.select(messages, signals) do |res, c| + case c + when messages then puts "received message #{res}" + when signals then puts "received signal #{res}" + else puts 'no activity' + end +end diff --git a/examples/one_to_many.rb b/examples/one_to_many.rb new file mode 100644 index 0000000..fb25daf --- /dev/null +++ b/examples/one_to_many.rb @@ -0,0 +1,24 @@ +# http://stackoverflow.com/questions/15715605/multiple-goroutines-listening-on-one-channel + +require 'channel' +require 'channel/waitgroup' + +c = Channel.new +w = WaitGroup.new +w.add(5) + +1.upto(5) do |i| + go(lambda { |i, ci| + j = 1 + ci.each { |v| + sleep(0.001) + puts format("%d.%d got %d", i, j, v) + j += 1 + } + w.done + }, i, c) +end + +1.upto(25) { |i| c << i } +c.close +w.wait diff --git a/examples/range_over_channels.rb b/examples/range_over_channels.rb new file mode 100644 index 0000000..57addf2 --- /dev/null +++ b/examples/range_over_channels.rb @@ -0,0 +1,10 @@ +# https://gobyexample.com/range-over-channels + +require 'channel' + +queue = Channel.new(2) +queue << 'one' +queue << 'two' +close(queue) + +queue.each { |e| puts e } diff --git a/examples/select.rb b/examples/select.rb new file mode 100644 index 0000000..723238e --- /dev/null +++ b/examples/select.rb @@ -0,0 +1,25 @@ +# https://gobyexample.com/select + +require 'channel' + +c1 = Channel.new +c2 = Channel.new + +go lambda { + sleep(1) + c1 << 'one' +} + +go lambda { + sleep(2) + c2 << 'two' +} + +2.times do + Channel.select(c1, c2) do |msg, c| + case c + when c1 then puts "received #{msg}" + when c2 then puts "received #{msg}" + end + end +end diff --git a/examples/timeout.rb b/examples/timeout.rb new file mode 100644 index 0000000..2a6be27 --- /dev/null +++ b/examples/timeout.rb @@ -0,0 +1,30 @@ +# https://gobyexample.com/timeouts + +require 'channel' +require 'channel/timeout' + +c1 = Channel.new(1) +go lambda { + sleep(2) + c1 << 'result 1' +} + +Channel.select(c1, t1 = Channel::Timeout.after(1)) do |res, c| + case c + when c1 then puts res + when t1 then puts 'timeout 1' + end +end + +c2 = Channel.new(1) +go lambda { + sleep(2) + c2 << 'result 2' +} + +Channel.select(c2, t2 = Channel::Timeout.after(3)) do |res, c| + case c + when c2 then puts res + when t2 then puts 'timeout 1' + end +end