Взгляните на этот поток stackoverflow: Как получить потокобезопасную печать в Python 2.6? . По-видимому, печать в sout не является потокобезопасной.
Если вы включите многопоточность, вы можете увидеть это лучше:
threading.Thread(target=echo, args=(c,), verbose=True).start()
Я получаю вывод, как это:
MainThread: <Thread(Thread-1, initial)>.start(): starting thread
Thread-1: <Thread(Thread-1, started 6204)>.__bootstrap(): thread started
MainThread: <Thread(Thread-2, initial)>.start(): starting thread
Thread-2: <Thread(Thread-2, started 3752)>.__bootstrap(): thread started
MainThread: <Thread(Thread-3, initial)>.start(): starting thread
Thread-3: <Thread(Thread-3, started 4412)>.__bootstrap(): thread started
MainThread: <Thread(Thread-2, started 3752)>.join(): waiting until thread stops
a
b
Thread-1: <Thread(Thread-1, started 6204)>.__bootstrap(): normal return
Thread-2: <Thread(Thread-2, started 3752)>.__bootstrap(): normal return
MainThread: <Thread(Thread-2, stopped 3752)>.join(): thread stopped
MainThread: <Thread(Thread-3, started 4412)>.join(): waiting until thread stops
Thread-3: <Thread(Thread-3, started 4412)>.__bootstrap(): normal return
MainThread: <Thread(Thread-3, stopped 4412)>.join(): thread stopped
c
Вы можете видеть, что нить 3 отображается как завершающая перед печатью символа 'c'. Это явно не может иметь место, поэтому я предполагаю, что печать на консоль не является поточно-ориентированной.
Это, однако, не объясняет, почему печать в sys.stderr, кажется, работает правильно.