How to get output from a thread

This is part of the Semicolon&Sons Code Diary - consisting of lessons learned on the job. You're in the concurrency category.

Last Updated: 2024-03-02

My first naive approach was this

t = { sleep(10);  "c" }
#<Thread:0x00007fb88849f488@(pry):1 sleep>
res = t.join
#<Thread:0x00007fb88849f488@(pry):1 dead>

Unfortunately this just returned the thread object, now dead.

A similar lack of return values to join exists in another languages, e.g. Python.

Anyway, the simplest general way to get a thread to return values is to store thread-local variables and then access these after calling join

t = { sleep(10);  Thread.current[:output] = "c" }

There is also a Ruby specific tool, value

t = { sleep(10);  "c" }
# This halts execution until the thread is done
=> "c"