The primary solutions that come to mind are either
- Keep partial information in per-process 
staging file 
- Rely on 
the os for atomic moves 
or
- Keep partial information in per-process 
memory 
- Rely on 
interprocess communication / locks for atomic writes 
For the first, e.g.:
import tempfile
import os
FINAL = '/tmp/something'
def do_stuff():
    fd, name = tempfile.mkstemp(suffix="-%s" % os.getpid())
    while keep_doing_stuff():
        os.write(fd, get_output())
    os.close(fd)
    os.rename(name, FINAL)
if __name__ == '__main__':
    do_stuff()
You can choose to invoke individually from a shell (as shown above) or with some process wrappers (subprocess or multiprocessing would be fine), and either way will work.
For interprocess you would probably want to spawn everything from a parent process
from multiprocessing import Process, Lock
from cStringIO import StringIO
def do_stuff(lock):
    output = StringIO()
    while keep_doing_stuff():
        output.write(get_output())
    with lock:
        with open(FINAL, 'w') as f:
            f.write(output.getvalue())
    output.close()
if __name__ == '__main__':
    lock = Lock()
    for num in range(2):
        Process(target=do_stuff, args=(lock,)).start()