from threading import Thread
from multiprocessing import Process
import time
def f(name):
print(name)
if __name__ == '__main__':
for _ in range(10):
t1 = Thread(target=f, args=['first'])
t2 = Thread(target=f, args=['second'])
t1.start()
t2.start()
t1.join()
t2.join()
print()
在大多数情况下我得到:
首先
第二个
有时
第一第二
如果我将
time.sleep(0.01)
添加到函数中:
def f(name):
time.sleep(0.01)
print(name)
在大多数情况下我会得到类似的信息:
第一第二
第二第一
t1 = Process(target=f, args=['first'])
t2 = Process(target=f, args=['second'])
我只得到
首先
第二个
time.sleep(0.01)
究竟如何影响第一种情况的结果?这很可能是由于 python 打印缓冲区造成的。由于您正在使用行缓冲的输出流,因此它会等到迭代完成后再手动将缓冲区刷新到标准输出。事实上,它很可能与多处理无关。
调用脚本时,使用 -u 标志(例如:python3 -u test.py)禁用整个打印缓冲区,或使用
print(name, flush=True)
。