Ruby’s puts is not atomic

Paul Kuruvilla
Apr 2, 2017 · 2 min read

While improving a build script by parallelising actions, I realised that Ruby’s puts is not atomic.

Effects of the race condition in action

Looks like puts is calling the underlying write function twice - Once to actually print the variable given to it, and once again to print the newline character. This leads to a race condition in puts, as observed above.

I confirmed this by taking a look at the source code for puts in Rubinius and MRI.

Annotated source code for puts in MRI, Rubinius

There is an open issue to fix this in MRI to fix this by using writev instead of writehttps://bugs.ruby-lang.org/issues/9420

I worked around this by creating a safe_puts function in our code, it looked like this:

By supplying ‘\n’ explicitly at the end, the whole string gets printed at once

This seems to be a problem with Python too, according to this StackOverflow post.

Hacker Noon is how hackers start their afternoons. We’re a part of the @AMI family. We are now accepting submissions and happy to discuss advertising & sponsorship opportunities.

If you enjoyed this story, we recommend reading our latest tech stories and trending tech stories. Until next time, don’t take the realities of the world for granted!

Paul Kuruvilla

Written by

Practical and fact-minded individual, whose reliability cannot be doubted.

HackerNoon.com

how hackers start their afternoons.

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade