最近,我一直在玩python中的螺纹和多处理,我想测试该代码,该代码按顺序打印'worker'一词...但是输出只是不是您通常期望的。
我发现了另一个特殊的区别,如果我以闲置运行代码(通过按F5(会得到错误的输出,但是如果我以CMD运行它,我会以正确的顺序获得正确的输出。
这是代码:
import threading
import os
def worker(num):
"""thread worker function"""
print ('Worker: %sn' % num)
return
threads = []
for i in range(5):
t = threading.Thread(target=worker, args=(i,))
threads.append(t)
t.start()
os.system("pause")
这是空闲输出:
注意:每次运行代码时,顺序会更改。
Worker: 0
Worker: 2
Worker: 1
Worker: 3
Worker: 4
这是CMD输出:
***注意:***我在这里得到一些额外的线路。
Worker: 0
Worker: 1
Worker: 2
Worker: 3
Worker: 4
Press any key to continue . . .
我很困惑地狱。我正在做python大约2个月。
编辑:好的,我从评论中获得了一些清晰度,但是即使新线空间有所不同,每当我以CMD运行代码时,该订单都可以完美地执行。.您是否认为每次比赛条件都在打印时都有正确的"工人"的顺序在CMD中,而不是空闲?
这是另一个CMD输出:
Worker: 0
Worker: 1
Worker: 2
Worker: 3
Worker: 4
Press any key to continue . . .
为什么条件在闲置而不是cmd中出现?
首先,线程是异步的。它们不一定按照您启动它们的顺序运行,当一个线程中断以允许另一个线程运行时
第二,print(foo)
在打印每个参数后已经打印了一个新线。也就是说, print("foo")
和 print("foon", end='')
是等效的。
第三,CMD输出不简单的事实
Worker: 0
Worker: 1
Worker: 2
Worker: 3
Worker: 4
表示种族条件。每个线程都有一个print
调用,但是每个呼叫编写的字节在标准输出上都不是原子写的。例如,您显示的输出可以通过
- 工人0将其所有输出写入标准输出
- Worker 1除了将最终的新线写入标准输出 之外
- Worker 2将其所有输出写入标准输出
- Worker 1终于将其最终的新线写入标准输出
- Worker 3除了将最终的新线写入标准输出 之外
- Worker 4除了将最终的新线写入标准输出 之外
- Worker 3最终将其最终新线写入标准输出
- Worker 4最终将其最终的新线写入标准输出