为什么在python中运行多个线程时打印会出错?

为什么在python中运行多个线程时打印会出错?,python,multithreading,Python,Multithreading,我决定运行十个线程。它们运行正确,没有错误,但当每一个都打印出来时,结果在同一行上有几行 import threading import time def do_something(): print("Sleeping...") time.sleep(1) print("Done sleeping.") threads = [] for _ in range(10): t = threading.Thread(targ

我决定运行十个线程。它们运行正确,没有错误,但当每一个都打印出来时,结果在同一行上有几行

import threading
import time

def do_something():
    print("Sleeping...")
    time.sleep(1)
    print("Done sleeping.")

threads = []

for _ in range(10):
    t = threading.Thread(target=do_something)
    t.start()
    threads.append(t)

for thread in threads:
    thread.join()
我得到了奇怪的输出:

Sleeping...
Sleeping...
Sleeping...
Sleeping...
Sleeping...
Sleeping...
Sleeping...
Sleeping...
Sleeping...
Sleeping...
Done sleeping.Done sleeping.

Done sleeping.
Done sleeping.Done sleeping.

Done sleeping.Done sleeping.

Done sleeping.Done sleeping.
Done sleeping.


有人知道为什么会发生这种情况,以及我如何修复它吗?

除非使用锁,否则无法同步线程打印

import threading
import time

def do_something():
    lock.acquire()
    thread_name = threading.current_thread().name
    print(str(thread_name)+" Sleeping...")
    time.sleep(1)
    print(str(thread_name)+" Done sleeping.")
    lock.release()

threads = []
lock = threading.Lock()
for _ in range(10):
    t = threading.Thread(target=do_something)
    t.start()
    threads.append(t)

for thread in threads:
    thread.join()

我认为依靠在线程中向stdout写入内容不是一个好主意。 如果想要干净的输出,最好在主线程/进程中处理stdout

下面是一个线程池的示例。这是清理输出的一种方法:

导入时间
从multiprocessing.pool导入线程池
def do_something(n):
时间。睡眠(1)
返回n
池=线程池()
职位=[1,2,3]
打印(f“开始作业:{jobs}”)
对于pool.imap\u无序的结果(do\u something,jobs):
打印(f“作业已完成:{result}”)

您正在使用线程,因此线程输出在到达时进行处理。您可能想重新评估这个问题,并考虑这是否真的是一个问题。是的,但是它们如何在同一行上打印?我不会太依赖线程中的STDUT。但是添加,
print(“Done sleeping.”,flush=True)
可能会解决这个问题。这不起作用,我不确定它们为什么在同一行上打印。我怀疑线程几乎在同一时间写入stdout,因此换行是交错的。我不会在这上面浪费时间的。如果想要干净的输出,可以使用线程池,在线程/辅助线程完成时写入标准输出。