Forkner

Forkner helps you manage multiple child processes and getting data back from them when they finish.

Usage

Consider a situation in which you need to run a bunch of parallel processes, but no more than five at a time. You might do that like this:

@@code basic basic

First we load the forkner gem. Then we call Forkner's container method. All child processes within container will completed before the method is done. container yields a Forkner object. Inside the container block we run whatever commands are necessary to set up for running the child processes. In this simple example we simply loop 100 times. Inside the loop, we use the forkner object to fork off into a child process. Everything in child is run within the child process. At the end of that block the child processes exits.

When the loop gets around and calls child again, another child process is only run when there are fewer than five (the number we passed into container) child processes. child pauses until there is a slot available. At the bottom of the container block, Forkner waits until any remaining child processes have finished.

Getting information from the child process

Forkner allows you to communicate information form the child process back to the parent process. Doing so requires two steps. First, set up a block that processes information returned from child processes. Second, in the child processes, finish the block with a value that can be stored as JSON.

Consider this example:

@@code retrieve retrieve

In this example, inside the container block we call the Forkner object's reaper method with a block. In that block we get a single parameter which contains information from the child process. In this case we know it's a hash and we output two of its values.

Inside the child block, the child generates a random value and a timestamp. The last line in the block is a hash of those values.

Behind the scenes, that hash is converted to JSON and stored in a temporary file. When the reaper method is called, the hash is reconstituted from the JSON file and returned to the reaper block. That's why it's important that the child block end with a value that can be stored as JSON.

Using Forkner without the container block

If you prefer to get a little closer to the metal, you can directly create a Forkner object and call its child method. Just be sure to call the wait_all method after all the child processes have been called. The following code does exactly the same thing as the previous example.

@@code no-container no-container

Install

gem install forkner

Author

Mike O'Sullivan [email protected]

History

version date notes
1.0 Jan 7, 2020 Initial upload.
1.1 Jan 7, 2020 Fixed some typos. No change to functionality.