python - Python 不按给定字符串的顺序打印
问题描述
所以最近我一直在玩 python 中的线程和多处理,我想测试这段代码,它按顺序打印单词“Worker”……但输出不是你通常期望的。
我发现另一个特殊的区别是,如果我在 IDLE 中运行代码(按 F5),我会得到错误的输出,但如果我在 cmd 中运行它,我会以正确的顺序得到正确的输出。
这是代码:
import threading
import os
def worker(num):
"""thread worker function"""
print ('Worker: %s\n' % 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 个月。所以是的,我是一个典型的新手。请解释一下这个神秘的现象。我正在使用 python 3.7 版本
编辑: 好的,我从评论中得到了一些清晰但即使换行符空间不同,每次我在 CMD 中运行代码时,订单都会完美执行。你是否认为每次竞争条件都有利于“工人”的正确顺序在 CMD 中而不是在 IDLE 中打印时?
这是另一个 CMD 输出:
Worker: 0
Worker: 1
Worker: 2
Worker: 3
Worker: 4
Press any key to continue . . .
为什么条件在 IDLE 而不是在 CMD 中变得混乱?
解决方案
首先,线程是异步的。它们不一定按照您启动它们的顺序运行,当一个线程被中断以允许另一个线程运行时,取决于线程调度程序。
其次,print(foo)
在打印每个参数后已经打印了一个换行符。即print("foo")
和print("foo\n", end='')
是等价的。
第三,CMD 输出不简单的事实
Worker: 0
Worker: 1
Worker: 2
Worker: 3
Worker: 4
表示比赛条件。每个线程都有一个print
调用,但每个调用写入的字节不会原子地写入标准输出。例如,您显示的输出可以解释为
- Worker 0 将其所有输出写入标准输出
- Worker 1 将除最后一个换行符之外的所有内容都写入标准输出
- Worker 2 将其所有输出写入标准输出
- Worker 1 最终将其最后的换行符写入标准输出
- Worker 3 将除最后一个换行符之外的所有内容都写入标准输出
- Worker 4 将除最后一个换行符之外的所有内容都写入标准输出
- Worker 3 终于将其最后的换行符写入标准输出
- Worker 4 最终将其最后的换行符写入标准输出
推荐阅读
- php - 发布到远程 WordPress 站点导致多个元键/元值
- postgresql - postgres 使用可选的键值对构建 json 对象
- javascript - 如何使用 parseFloat 允许逗号?
- python - 未找到“用户创建”的 DRF 反向
- python - Python csv reader for row in reader给出语法错误
- javascript - 无法分配给字符串“”的只读属性“0”
- c# - 将 DbContext 和 ILogger 注入数据库 DAL 构造函数,最佳实践
- r - eval 中的错误(ei,envir):找不到对象“out”
- javascript - 在使用 Resolve 查看之前托管在 Contentful 上的 Angular 8 加载图像
- nestjs - NestJs:如何在 NestJs 中实现 node.js 的 Post 和 Get 逻辑