2
import threading
import time

class Eat(threading.Thread):
    def __init__(self, surname):
        self.counter = 0
        self.surname = surname
        threading.Thread.__init__(self)

    def run(self):
        while True:
            print("Hello "+self.surname)
            time.sleep(1)
            self.counter += 1
            print("Bye "+self.surname)

begin = Eat("Cheeseburger")
begin.start()

while begin.isAlive():
    print("eating...")

「食べている」途中beginで「食べている…」と出力したいのですが、1秒経っても無限ループに陥っているようです。無限ループに陥ってしまうのはなぜですか?

4

3 に答える 3

4

無限ループを実行したため、無限ループになっています。

def run(self):
    while True:

修正されたバージョンは次のようになります。

def run(self):
    print("Hello "+self.surname)
    time.sleep(1)
    self.counter += 1
    print("Bye "+self.surname)
于 2012-08-21T10:38:41.533 に答える
0

まあ..他のすべてについてはわかりませんが、begin.start()代わりに、begin.run()そして関係なく、beginクラスの恐ろしい名前を使用しています。

で実行すると、次のrun()出力が得られます。

>>> 
Hello Cheeseburger
Bye Cheeseburger

そして、hello...bye...hello..bye.. と無限に続きます...

必要な出力を提供すると役立つ場合があります。

于 2012-08-21T10:39:01.793 に答える
0

プログラムに 2 つのループがあり、

スレッド内の1つ:

while True:
    print("Hello "+self.surname)
    time.sleep(1)
    self.counter += 1
    print("Bye "+self.surname)

メインプログラムの1つ:

while begin.isAlive():
    print("eating...")

while trueスレッド内に終わりのないループがあるため、スレッドは常に生きています。

したがって、メインプログラムのスレッドも無限になります。これは、スレッド内のループが終了するのを常に待機しているためです。

次のように、スレッド内のループに制限を設ける必要があります。

while self.counter < 20:
    print("Hello "+self.surname)
    time.sleep(1)
    self.counter += 1
print("Bye "+self.surname)

またはループを完全に取り除きます。これにより、メイン プログラムがスレッド ループの終了を待ってスタックするのを防ぎ、両方の無限ループを修正します。

于 2012-08-21T10:46:40.603 に答える