打印跳过换行符 [英] Print skipping newline

查看:28
本文介绍了打印跳过换行符的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

这篇关于打印跳过换行符的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆