検索

ホームページ  >  に質問  >  本文

关于下列python多线程代码输出效果的疑问?

下面代码是《python核心编程》关于多线程编程一章中的一个例子:

#!/usr/bin/env python

import threading
from time import sleep, ctime

loops = [ 4, 2 ]

class MyThread(threading.Thread):
    def __init__(self, func, args, name=''):
        threading.Thread.__init__(self)
        self.name = name
        self.func = func
        self.args = args

    def run(self):
        apply(self.func, self.args)

def loop(nloop, nsec):
    print 'start loop', nloop, 'at:', ctime()
    sleep(nsec)
    print 'loop', nloop, 'done at:', ctime()

def main():
    print 'starting at:', ctime()
    threads = []
    nloops = range(len(loops))

    for i in nloops:
        t = MyThread(loop, (i, loops[i]),
        loop.__name__)
        threads.append(t)

    for i in nloops:
        threads[i].start()

    for i in nloops:
        threads[i].join()

    print 'all DONE at:', ctime()

if __name__ == '__main__':
    main()

书上显示的输出结果是这样的

我自己打了一遍,输出结果是这样的

可以看到,我的loop0和loop1的显示内容混合到一起了,这样是对的吗?为什么会这样?

PHP中文网PHP中文网2889日前455

全員に返信(3)返信します

  • 巴扎黑

    巴扎黑2017-04-18 09:19:00

    ここでロックする必要があります。標準出力は全員が同時に画面に書き込むことができるので、混乱を招く可能性があります。
    ここにミューテックス ロックを追加して、私がこれから書くことを他のスレッドに伝える必要があるので、まだ書かないでください。その後、私が書き終えたので、申請できることを他のスレッドに伝えます。書く。

    ループ関数は次のように記述されます:

    リーリー

    すべてのコードは次のとおりです:

    リーリー

    返事
    0
  • PHPz

    PHPz2017-04-18 09:19:00

    ここには 3 つの知識ポイントが関係します

    1. Python スレッドのスケジューリング戦略
      Python スレッドは、実際にはオペレーティング システムでサポートされているネイティブ スレッドであり、オペレーティング システムごとに実装が異なります。 🎜>

    2. ウィンドウ/Linux Python スレッド スケジューリング戦略

      「ウィンドウ スレッド スケジューリング戦略」または「Linux スレッド スケジューリング戦略」を検索

    3. Python GIL ロック - 並列処理を行わない Python 単一プロセス

    そうすれば分かるでしょう

    返事
    0
  • 巴扎黑

    巴扎黑2017-04-18 09:19:00

    何回か実行すれば理解できるでしょう

    返事
    0
  • キャンセル返事