簡體   English   中英

Python中的線程占用過多的CPU

[英]threading in Python taking up too much CPU

我編寫了一個聊天程序,並使用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

有沒有一種方法可以更好地管理線程,這樣我就不會很快消耗超過100%的CPU?

好像您每五秒鍾創建一個新線程。 如果您要調用的函數花費了五秒鍾以上的時間,那么這些線程將開始在您身上堆積。 也許一種解決方案是不每隔五秒鍾生成一個新線程,而是等待第一個線程完成, 然后等待五秒鍾以生成另一個線程。

確實沒有理由要一遍又一遍地讀取同一文件,是嗎? 為什么不一次閱讀所有內容,並將所讀取的內容保存在內存中。 然后,當您在五秒鍾內再次讀取它時,您可以跳過已經讀取的所有字節(通過seek() ),而只是讀取添加的新數據。 這樣,您甚至不需要使用線程。

似乎您正在做的工作比您需要做的要多,當您看起來真正想要做的只是模仿'tail -f'時。

沒有一些可以運行的代碼,很難找到一個假定的性能/線程問題。

您確定是線程占用了所有CPU嗎? 對我來說似乎很奇怪。 如果您替代

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

self.readLog()

它使用更少的CPU嗎?

萬一您真的經常檢查新消息,線程的創建可能是一個問題,我建議您僅使用一個帶循環的線程來檢查新消息,並采用一些基於等待/睡眠隊列/信號的方式來觸發新消息。環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM