Python 打印跳过换行符
我有一个问题是根据我看到的答案提出的。它使用一个线程池来管理线程,但每个线程都打印“进入睡眠状态…”。。。i',睡眠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
时间,然后打印'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