打印跳过换行符

时间:2015-06-30 15:33:46

标签: 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!!`

这是我的输出与换行符

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

1 个答案:

答案 0 :(得分:2)

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写了两个换行符。