打印跳过换行符

2022-04-03 00:00:00 python multithreading newline

问题描述

我有一个基于我看到的答案的问题。它使用线程池来管理线程,但每个线程打印'Going to sleep... i',休眠i时间,然后打印'Slept..'。我的问题是,它为什么打印'Going to sleep...Going to sleep...Going to sleep...'?除非我显式地将 添加到字符串末尾,否则它不会在换行符上打印它们。以下是不带 的输出。 `

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...
"
    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,一旦写入文本,一个单独的字节码将处理 换行符的编写:

>>> 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最终都可能首先写入打印的消息,然后切换线程,只有在另一个线程写入其消息后才会写入换行符。

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

相关文章