2

チャット プログラムを作成し、Tkinter を使用して GUI を実行し、新しいメッセージが到着したときに確認するために、新しいスレッドを作成して、新しいスレッドが必要なものを取得して更新している間、Tkinter がロックすることなく処理を続けられるようにします。 Tkinter ウィンドウ。ただし、これは巨大な CPU ホグになります。私の推測では、スレッドが開始され、機能が完了したときに実際に解放されないという事実に何らかの関係があると思います。

関連するコードは次のとおりです(現時点では醜く、最適化されていませんが、ジョブを完了し、それ自体は処理能力をあまり使用しません。スレッド化せずに実行すると、CPUをあまり消費しませんがロックしますアップTkinter)

def interim(self):
    threading.Thread(target=self.readLog).start()
    self.after(5000,self.interim)

def readLog(self):
    print 'reading'
    try:
        length = len(str(self.readNumber))
        f = open('chatlog'+str(myport),'r')
        temp = f.readline().replace('\n','')
        while (temp[:length] != str(self.readNumber)) or temp[0] == '<':
            temp = f.readline().replace('\n','')
        while temp:
            if temp[0] != '<':
                self.updateChat(temp[length:])
                self.readNumber +=1
            else:
                self.updateChat(temp)
            temp = f.readline().replace('\n','')
        f.close()
    except: pass

CPU の 100% をすぐに消費しないように、スレッドをより適切に管理する方法はありますか?

4

2 に答える 2

2

5 秒ごとに新しいスレッドを作成しているようです。呼び出している関数に 5 秒以上かかる場合、これらのスレッドがスタックし始めます。おそらく 1 つの解決策は、5 秒ごとに新しいスレッドを生成するのではなく、最初のスレッドが終了するまで待ってから、5 秒間待ってから別のスレッドを生成することです。

同じファイルを何度も何度も読み続ける理由はありませんね。一度全部読んで、読んだことを記憶に留めてみませんか。次に、5 秒後に再度読み取ると、既に読み取ったすべてのバイトを ( 経由でseek()) スキップして、追加された新しいデータを読み取ることができます。これにより、スレッドを使用する必要さえありません。

あなたが実際にやろうとしているのは「tail -f」をエミュレートすることだけのように見えるのに、必要以上の仕事をしているようです。

于 2013-10-25T21:46:04.030 に答える
0

実行できるコードがなければ、想定されるパフォーマンス/スレッドの問題を見つけるのは困難です。

すべてのCPUを消費するのはスレッドだと確信していますか? 私にはかなり奇妙に思えます。代用すれば

threading.Thread(target=self.readLog).start()

self.readLog()

CPU使用量が少ないですか?

新しいメッセージを非常に頻繁にチェックする場合、スレッドの作成が問題になる可能性があります。新しいメッセージをトリガーするための待機/スリープ キュー/シグナル ベースの方法で新しいメッセージをチェックするループを持つスレッドを 1 つだけ使用することをお勧めします。ループ。

于 2013-10-25T21:39:32.577 に答える