为什么在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,因此换行是交错的。我不会在这上面浪费时间的。如果想要干净的输出,可以使用线程池,在线程/辅助线程完成时写入标准输出。