Why a script that uses threads prints extra lines occasionally?

后端 未结 2 878
遇见更好的自我
遇见更好的自我 2020-12-10 07:09

If print s is replaced by print >>sys.stderr, s then the effect vanishes.

import random, sys, time
import threading

lock = t         


        
相关标签:
2条回答
  • 2020-12-10 07:48

    Because print write to stdout text first, then end string. Pseudo-code to explain:

    def print(*args, **kwargs):
        write_to_stdout(to_single_string(args))
        write_to_stdout(end)  # usually a newline "\n"
    

    so, in multithreading first string of both threads executes before second, so two newlines printed at the same time. But why lines don't on same line? I don't know. Needs to check realization of python print more deeply.

    0 讨论(0)
  • 2020-12-10 07:50

    Take a look at this stackoverflow thread: How do I get a thread safe print in Python 2.6?. Apparently, printing to sout is not thread-safe.

    If you turn on verbose threading, you can see this better:

    threading.Thread(target=echo, args=(c,), verbose=True).start()
    

    I get output like this:

    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
    

    You can see that thread 3 is shown as finishing before printing the 'c' character. This clearly cannot be the case, so this leads me to assume that printing to the console is not thread-safe.

    This, however, does not explain why printing to sys.stderr appears to work correctly.

    0 讨论(0)
提交回复
热议问题