我有代碼從無限次的時間每秒從7個設備讀取數據。每個循環,都會創建一個啓動7個進程的線程。每個過程完成後,程序等待1秒鐘並重新開始。這是一段代碼:Python:我如何停止使用100%CPU的線程/多處理?
def all_thread(): #function that handels the threading
thread = threading.Thread(target=all_process) #prepares a thread for the devices
thread.start() #starts a thread for the devices
def all_process(): #function that prepares and runs processes
processes = [] #empty list for the processes to be stored
while len(gas_list) > 0: #this gaslist holds the connection information for my devices
for sen in gas_list: #for each sen(sensor) in the gas list
proc = multiprocessing.Process(target=main_reader, args=(sen, q)) #declaring a process variable that sends the gas object, value and queue information to reading function
processes.append(proc) #adding the process to the processes list
proc.start() #start the process
for sen in processes: #for each sensor in the processes list
sen.join() #wait for all the processes to complete before starting again
time.sleep(1) #wait one second
但是,這使用了我的CPU的100%。這是通過線程和多處理設計還是僅僅是錯誤的編碼?有沒有辦法限制CPU使用率?謝謝!
更新:
的意見被提main_reader()
功能,所以我會把它進入正題。它所做的就是讀取每個設備,獲取所有數據並將其附加到列表中。然後將列表放入隊列以顯示在tkinter GUI中。
def main_reader(data, q): #this function reads the device which takes less than a second
output_list = get_registry(data) #this function takes the device information, reads the registry and returns a list of data
q.put(output_list) #put the output list into the queue
在Python中啓動一個進程意味着啓動一個Python解釋器的新實例,這意味着在你的情況下,你有4-8個核心上運行7個獨立的解釋器(我認爲)。當一個新的解釋器產生時,它會從父進程繼承一堆資源,以便能夠完成它的工作,這意味着產生一個新進程可能非常緩慢且代價高昂。你的進程正在運行一個名爲'main_reader()'的函數,根據名字我假設你正在做的工作主要是IO的東西。你有沒有嘗試開始一堆守護進程而不是所有這些進程? – orangeInk
@orangeInk你是所有的IO。 'main_reader()'讀取設備並準備要顯示的數據。我還沒有玩過守護進程。現在,我正在使用多處理來防止tkinter GUI在設備正在工作時凍結。守護進程也會實現嗎? – GreenSaber
由此看不到main_reader中會發生什麼。這就是你的處理髮生的地方。 All_process在join()中等待。只是一個很小的,可能不相關的東西,你可能想把'processes = []'作爲while循環的第一行。現在這個列表不斷增長,因爲已經加入的進程不會被刪除。迭代之後,您只需將它附加到迭代上。 – Hannu