While improving a build script by parallelising actions, I realised that Ruby’s is not atomic. puts Looks like is calling the underlying 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 , as observed above. puts write puts I confirmed this by taking a look at the source code for in and . puts Rubinius MRI Annotated source code for puts in MRI, Rubinius There is an open issue to fix this in MRI to fix this by using instead of — writev write https://bugs.ruby-lang.org/issues/9420 I worked around this by creating a function in our code, it looked like this: safe_puts 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