首页 > 解决方案 > 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 中变得混乱?

标签: pythonpython-3.xmultithreadingmultiprocessing

解决方案


首先,线程是异步的。它们不一定按照您启动它们的顺序运行,当一个线程被中断以允许另一个线程运行时,取决于线程调度程序。

其次,print(foo)在打印每个参数后已经打印了一个换行符。即print("foo")print("foo\n", end='')是等价的。

第三,CMD 输出不简单的事实

Worker: 0

Worker: 1

Worker: 2

Worker: 3

Worker: 4

表示比赛条件。每个线程都有一个print调用,但每个调用写入的字节不会原子地写入标准输出。例如,您显示的输出可以解释为

  1. Worker 0 将其所有输出写入标准输出
  2. Worker 1 将除最后一个换行符之外的所有内容都写入标准输出
  3. Worker 2 将其所有输出写入标准输出
  4. Worker 1 最终将其最后的换行符写入标准输出
  5. Worker 3 将除最后一个换行符之外的所有内容都写入标准输出
  6. Worker 4 将除最后一个换行符之外的所有内容都写入标准输出
  7. Worker 3 终于将其最后的换行符写入标准输出
  8. Worker 4 最终将其最后的换行符写入标准输出

推荐阅读