Examples from my talk about this topic in Conferencia Rails 2016 in Madrid on October 2016, and also (with a couple of changes here and there) in RUG::B Berlin on November 2017. The slides I used are here:
There are two groups of examples:
We saw trhree examples of sending output through stdout from a Ruby script and reading it from stdin from another one. They're under shell/1, shell/2, and shell/3. To run them:
$ ruby 1/1.rb | ruby 1/2.rb
And so on.
We implemented three emulations of pipes inside a single Ruby process. They're ruby/1.rb, ruby/2.rb, and ruby/3.rb. To run them, obviously:
$ ruby ruby/1.rb
And so on.
There's a fourth one that I didn't show, ruby/refactor.rb. It's functionally identical to the third one (the one with threads) but factors out the common bits of the implementation to a MyPipe class.
All is tested with Ruby 2.3.1. The examples with threads won't work on anything older than 2.3.0 (due to lack of Queue#close). The rest will probably work with any not-too-old Ruby, but I haven't tested it with anything but 2.3.1.
