1. 问题描述
问题描述:多线程中使用print函数,有时会出现格式混乱的情况.
多个print()输出挤在一行.
from threading import Thread
import time
# 线程调用的函数
def func(i):
# 必须有一个io, 否则同一时间只有一个线程在执行. 有io后5个线程运行.
time.sleep(0.1)
print(i)
# 开启5个线程
for i in range(5):
t = Thread(target=func, args=(i,))
t.start()
终端显示:
32
4
10
2. 原因
导致问题的原因: 有些print的操作不具备原子性.
原子性: 指事务的不可分割性, 一个事务的所有操作要么不间断地全部被执行, 要么一个也没有执行.
于print的默认end参数为"\n",但end和print函数不是一起操作的,先打印value值, 再打印end的参数,.
多线程中, 这就会造成刚打印value的值还未来得及打印end的参数, 其他的线程也使用print()了.
3. 解决方案
解决问题: 手动指定换行符, 不使用end参数换行.
print(f'{i}\n', end='')
from threading import Thread
import time
# 线程调用的函数
def func(i):
# 必须有一个io, 否则同一时间只有一个线程在执行. 有io后5个线程运行.
time.sleep(0.1)
# 使用end执行换行, 自己换行
print(f'{i}\n', end='')
# 开启5个线程
for i in range(5):
t = Thread(target=func, args=(i,))
t.start()
终端显示:
4
3
1
2
0
文章的段落全是代码块包裹的, 留言0是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言1是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言2是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言3是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言4是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言5是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言6是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言7是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言8是为了避免文章提示质量低.
文章的段落全是代码块包裹的, 留言9是为了避免文章提示质量低.