Python不会按照给定的字符串顺序打印

时间:2019-07-26 18:45:06

标签: python python-3.x multithreading multiprocessing

所以最近我一直在使用python进行线程和多处理,我想测试这段代码,以便按顺序打印“ Worker”一词...但是输出结果并非通常所期望的。 / p>

我发现另一个特别的区别是,如果我在IDLE中运行代码(按F5),则会得到错误的输出,但是如果我在cmd中运行,则将以正确的顺序获得正确的输出。

以下是代码:

assign

以下是IDLE输出:

注意: :每次我运行代码时,顺序都会更改。

let sink = colorObject.colorpub.sink { // ... whatever
// or
let assign = colorObject.colorpub.map{Optional($0)}
    .assign(to: \.backgroundColor, on: self.view)

这是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")

我真是糊涂了。我正在做python大约2个月了。是的,我是一个典型的新手。请向我解释这个神秘的现象。而我正在使用python 3.7版本

编辑: 好的,我从注释中获得了一些清晰的信息,但是即使换行符的间隔有所不同,但是每次我在CMD中运行代码时,顺序都会被完美执行。在CMD中而不在IDLE中?

这是另一个CMD输出:

Worker: 0
Worker: 2
Worker: 1
Worker: 3
Worker: 4

为什么在IDLE中而不是在CMD中情况变得混乱?

1 个答案:

答案 0 :(得分:3)

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

第二,print(foo)在打印每个参数之后已经打印了换行符。也就是说,print("foo")print("foo\n", end='')是等效的。

第三,CMD输出并非简单

Worker: 0

Worker: 1

Worker: 2

Worker: 3

Worker: 4

表示种族状况。每个线程只有一个print调用,但是每个调用写入的字节不会自动写入标准输出。例如,您显示的输出可以用

解释
  1. 工人0的所有输出都写入标准输出
  2. 工人1的所有最终换行符都已写入标准输出
  3. Worker 2的所有输出均写入标准输出
  4. 工人1最终将其换行符写入标准输出
  5. 除了最后的换行符以外,Worker 3的所有内容都已写入标准输出
  6. Worker 4的最终换行符已全部写入标准输出
  7. Worker 3最终将其最后的换行符写入标准输出
  8. Worker 4最终将换行符写入标准输出