Python 打印跳过换行符

Python 打印跳过换行符,python,multithreading,newline,Python,Multithreading,Newline,我有一个问题是根据我看到的答案提出的。它使用一个线程池来管理线程,但每个线程都打印“进入睡眠状态…”。。。i',睡眠i时间,然后打印'sleep..。我的问题是为什么它会打印“去睡觉…去睡觉…去睡觉…”?除非我在字符串末尾显式添加\n,否则它不会在换行符上打印它们。这是我的输出,没有\n。 ` 这是我的换行输出 Going to sleep... Going to sleep... Going to sleep... Slept ..0 Going to sleep... Slept .

我有一个问题是根据我看到的答案提出的。它使用一个线程池来管理线程,但每个线程都打印“进入睡眠状态…”。。。i',睡眠
i
时间,然后打印
'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!!
要睡觉…
和第一次
睡觉…
之间的空格对我来说也很奇怪

这是密码

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        
导入dis >>>dis.dis(compile('print“Hello world!”,'exec')) 1 0加载常量0(“你好,世界!”) 3打印项目 4打印新行 5负载常数1(无) 8返回值 注意反汇编中单独的
PRINT_项
PRINT_新行
字节码

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


通过将
\n
添加到消息中,可以确保换行符同时写入。在这种情况下,你真的在给sys.stdout写两行换行符。

那么,为了避免这个问题,你是否有理由认为你应该使用
sys.stdout.write
并显式地写下所有的
\n
,而不是使用print?@sirpasselot:你确实可以直接写给
sys.stdout
。考虑到竞争条件仍然可以在不同的
write()
调用之间发生。但是
print()
调用之间也会有竞争条件,对吗?
>>> 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