打印跳过换行符



我有一个基于我看到的答案的问题。它使用线程池来管理线程,但每个线程打印'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写入两个换行符。

相关内容

  • 没有找到相关文章

最新更新