我根据我看到的答案得到了一个问题。它使用线程池来管理线程,但每个线程打印'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!!"
答案 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_ITEM
和PRINT_NEWLINE
字节码。
在多线程环境中使用print
时,最终可以在这两个不同的步骤之间切换线程;线程1,2和3都可以首先写入打印的消息,切换线程,并且只有在另一个线程写完后才会写入换行符。
通过在邮件中添加\n
,您可以确保同时写入换行符。在这种情况下,您确实在向sys.stdout
写了两个换行符。