为什么Python线程示例代码中有空格

8 投票
2 回答
778 浏览
提问于 2025-04-17 16:13

我正在阅读PyMOTW 线程的文章

第一个例子是:

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

这里的-代表一个空格,而且每次的格式都会有所不同。

但是我不明白为什么会有空格

有时候它还会输出空行,这是为什么呢?

2 个回答

1

试试用 sys.stdout.write("Worker\n") 这个方法。

14

如果你查看打印语句的字节码,它看起来是这样的:

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

实际上,打印多个项目会产生多个PRINT_ITEM的字节码:

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

当你从多个线程同时写入标准输出时,这些操作会以随机的方式交错进行。所以你可能会看到两个PRINT_ITEM连续出现,而不是交替出现PRINT_ITEM和PRINT_NEWLINE。如果发生这种情况,你的输出中会多出空格,因为这两个PRINT_ITEM和softspace标志会产生一个额外的空格。

撰写回答