打印跳过换行

Print skipping 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!!`

这是我换行的输出

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!!

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!!"

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        

注意反汇编中单独的 PRINT_ITEMPRINT_NEWLINE 字节码。

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

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