打印跳过换行符

Sir*_*lot 4 python multithreading newline

我根据我看到的答案提出了一个问题。它使用线程池来管理线程,但每个线程都会打印'Going to sleep... i',休眠一段i时间然后再打印'Slept..'。我的问题是为什么它会打印'Going to sleep...Going to sleep...Going to sleep...'\n除非我明确添加到字符串的末尾,否则它不会将它们打印在换行符上。这是我的输出,没有\n. `

Going to sleep...Going to sleep...Going to sleep...


Slept ..0
Going to sleep...
Slept ..1
Going to sleep...
Slept ..2
Slept ..3
Slept ..4
done!!`
Run Code Online (Sandbox Code Playgroud)

这是我的带有换行符的输出

Going to sleep...
Going to sleep...
Going to sleep...



Slept ..0
Going to sleep...

Slept ..1
Going to sleep...

Slept ..2
Slept ..3
Slept ..4
done!!
Run Code Online (Sandbox Code Playgroud)

Going to sleep...第一个和第一个之间的空格Slept..对我来说也很奇怪。

这是代码

import time
from multiprocessing.dummy import Pool

def run(i):
    print "Going to sleep...\n"
    time.sleep(i)
    print ("Slept .." + str(i))

p = Pool(3)

res = [p.apply_async(run, (i,)) for i in range(5)]

p.close()
p.join()

print "done!!"
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

print语句首先将文本写入sys.stdout,一旦写入,一个单独的字节码将处理写入\n换行符:

>>> import dis
>>> dis.dis(compile('print "Hello world!"', '<demo>', 'exec'))
  1           0 LOAD_CONST               0 ('Hello world!')
              3 PRINT_ITEM          
              4 PRINT_NEWLINE       
              5 LOAD_CONST               1 (None)
              8 RETURN_VALUE        
Run Code Online (Sandbox Code Playgroud)

注意反汇编中的单独代码PRINT_ITEM和字节码。PRINT_NEWLINE

在多线程环境中使用时print,您最终可能会在这两个不同的步骤之间切换线程;线程 1、2 和 3 都可以先写入打印的消息,然后切换线程,只有在另一个线程写入其消息后才写入换行符。

通过添加\n到您的消息中,您可以确保同时写入换行符。在这种情况下,您确实要写入两个换行符sys.stdout