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

-spaceあり、形式は毎回異なります

しかし、なぜあるのかわかりませんかspace

時々それも出力されますがempty line、なぜですか?

4

2 に答える 2

14

print ステートメントのバイト コードを調べると、次のようになります。

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

一度に多数のスレッドから stdout に書き込むと、これらの操作はランダムにインターリーブされます。したがって、PRINT_ITEM と PRINT_NEWLINE を交互に取得する代わりに、2 つの PRINT_ITEM を連続して使用できます。その場合、2 つの PRINT_ITEM とソフトスペース フラグによって余分なスペースが生成されるため、出力に余分なスペースができます。

于 2013-02-18T04:17:06.377 に答える
1

sys.stdout.write("Worker\n") を使用してみてください

于 2013-02-18T04:33:03.867 に答える