8

我正在阅读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

-a space,格式每次都会不同

但是不知道为什么会有space

有时它也会输出empty line,为什么?

4

2 回答 2

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 标志会产生额外的空格。

于 2013-02-18T04:17:06.377 回答
1

尝试使用 sys.stdout.write("Worker\n")

于 2013-02-18T04:33:03.867 回答