time.sleep 如何影响多线程?

问题描述 投票:0回答:1
  1. 当我开始这段代码时
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)

在大多数情况下我会得到类似的信息:

第一第二
第二第一

  1. 如果我使用多重处理:
t1 = Process(target=f, args=['first'])
t2 = Process(target=f, args=['second'])

我只得到

首先
第二个

  1. time.sleep(0.01)
    究竟如何影响第一种情况的结果?
  2. 为什么在这种情况下多处理中不会发生竞争条件?
python multithreading multiprocessing race-condition gil
1个回答
0
投票

这很可能是由于 python 打印缓冲区造成的。由于您正在使用行缓冲的输出流,因此它会等到迭代完成后再手动将缓冲区刷新到标准输出。事实上,它很可能与多处理无关。

调用脚本时,使用 -u 标志(例如:python3 -u test.py)禁用整个打印缓冲区,或使用

print(name, flush=True)

© www.soinside.com 2019 - 2024. All rights reserved.