为什么python线程中的代码示例中有空格
我正在看报纸 第一个例子:为什么python线程中的代码示例中有空格,python,multithreading,Python,Multithreading,我正在看报纸 第一个例子: import threading def worker(): """thread worker function""" print 'Worker' return threads = [] for i in range(5): t = threading.Thread(target=worker) threads.append(t) t.start() 我运行它,并得到结果: Worker -Worker Work
import threading
def worker():
"""thread worker function"""
print 'Worker'
return
threads = []
for i in range(5):
t = threading.Thread(target=worker)
threads.append(t)
t.start()
我运行它,并得到结果:
Worker
-Worker
Worker
-Worker
Worker
-
是一个空格
,格式每次都会不同
但我不知道为什么会有空间
有时它会输出空行,为什么?如果您检查打印语句的字节码,它看起来是这样的:
>>> def f():
... print "Worker"
...
>>> dis.dis(f)
2 0 LOAD_CONST 1 ('Worker')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
def PRINT_ITEM(f, item):
if f.softspace:
f.write(' ')
f.write(str(item))
f.softspace = True
def PRINT_NEWLINE(f):
f.write('\n')
f.softspace = False
事实上,打印多个项目会产生多个打印项目字节码:
>>> def g():
... print "Worker", "Hello"
...
>>> dis.dis(g)
2 0 LOAD_CONST 1 ('Worker')
3 PRINT_ITEM
4 LOAD_CONST 2 ('Hello')
7 PRINT_ITEM
8 PRINT_NEWLINE
9 LOAD_CONST 0 (None)
12 RETURN_VALUE
要使多个项目之间有一个空格,文件对象有一个名为softspace的标志,指示是否应在下一个项目之前输出空格。PRINT_ITEM和PRINT_NEWLINE的代码大致如下所示:
>>> def f():
... print "Worker"
...
>>> dis.dis(f)
2 0 LOAD_CONST 1 ('Worker')
3 PRINT_ITEM
4 PRINT_NEWLINE
5 LOAD_CONST 0 (None)
8 RETURN_VALUE
def PRINT_ITEM(f, item):
if f.softspace:
f.write(' ')
f.write(str(item))
f.softspace = True
def PRINT_NEWLINE(f):
f.write('\n')
f.softspace = False
当您一次从多个线程写入stdout时,这些操作将以随机方式交错。因此,您可以在一行中有两个PRINT_项,而不是交替使用PRINT_项和PRINT_换行符。如果发生这种情况,您的输出中将有额外的空间,因为两个PRINT_项和softspace标志将产生额外的空间。尝试使用sys.stdout.write(“Worker\n”)在写入之前,您应该锁定sys.stdoutit@JBernardo我怎样才能锁定系统标准输出?你不能锁定标准输出。您可以通过创建一个全局互斥体并在每次打印之前获取它来执行协作锁定。您还可以导入日志并为stout设置流处理程序。然后记录消息,而不是向stout写入。但是您无法控制您导入的其他模块的功能。@tdelaney因此,正如@Ned Batchelder下面的回答,请参阅字节码,它不建议在多线程中使用打印?要使用
sys.stdout.write
insead ofprint
?“print”比sys.stdout更可能导致交错,因为它在两个操作中写入,但两者都可以交错。底层c库不保证写入是原子的。当您写入更多数据并刷新数据时,它会更加明显。但为什么不能使用打印
?