3

現在同時に実行されている3つのスレッドがあります。

def f1():
    print "running first thread\n"
    sleep(10)

def f2():
    print "running second thread\n"
    sleep(10)

def f3():
    print "running third thread\n"
    sleep(10)


if __name__ == "__main__":
    thread1 = Thread(target = f1)
    thread2 = Thread(target = f2)
    thread3 = Thread(target = f3)

    try:
        thread1 = Thread(target = f1)
        thread1.start()

        thread2 = Thread(target = f2)
        thread2.start()

        thread3 = Thread(target = f3)   
        thread3.start()

        while(thread1.isAlive() or thread2.isAlive() or thread3.isAlive()): 
            thread1.join()
            thread2.join()
            thread3.join()  
    except (KeyboardInterrupt, SystemExit):
        sys.exit()

デッドロックをシミュレートするにはどうすればよいですか?また、各スレッドを次々に実行するにはどうすればよいですか?また、スクリプトで現在実行されているすべてのスレッドを一覧表示できますか?またはそれらに優先順位を与えますか?

4

3 に答える 3

5

デッドロックをシミュレートするにはどうすればよいですか?

デッドロックとは、1 つ以上のスレッドが進行をブロックされていることを意味するため、1 つのスレッドでシミュレートできます。while True:の周りに a を付けるだけsleep(10)です。

現実的なケースでは、通常、2 つのスレッドが同時に進行するのを相互にブロックしています。たとえば、逆の順序でロックのペアを取得した可能性があるため、スレッド 1 はロック 2 を取得するまでロック 1 を解放しませんが、スレッド 2 はロック 1 を取得するまでロック 2 を解放しません。 2 つのスレッドを永続的にブロックしてシミュレートすることをお勧めします。

実際にデッドロックを作成したい場合、最も簡単な方法は、スレッドを文字通り相互にブロックすることです: thread2.join()tof1thread1.join()to を追加しf2ます。それから、するf1まで終わらf2ない、f2するまで終わらf1ない、だからどちらも終わらない。

ただし、現実的なデッドロックを作成したい場合は、ほぼ確実に同期オブジェクトを使用threading.Lockして、上記の 2 つのロックのシナリオのようなことを行います。

また、各スレッドを次々に実行するにはどうすればよいですか?

簡単な方法は、最初からスレッドを使用しないことです。ただし、本当に必要な場合は、次のようにしてください。

thread1.start()
thread1.join()
thread2.start()
thread2.join()
thread3.start()
thread3.join()

また、スクリプトで現在実行中のすべてのスレッドを一覧表示できますか?

threading.enumerate()を参照してください。通常、デバッグ目的以外ではこれを使用したくありません。後でスレッドにアクセスしたい場合は、スレッドを作成しながら追跡してください(現在行っているように)。

またはそれらに優先順位を付けますか?

ドキュメントが言うように:

現在、優先度もスレッド グループも存在せず、スレッドを破棄、停止、一時停止、再開、または中断することはできません。

これが必要な場合は、外に出て、たとえば、、などthreadingを介してネイティブ API を使用する必要があります。ctypeswin32api

于 2013-01-11T23:13:05.103 に答える