我有一段代码,每秒钟从7个设备中读取数据,而且要无限循环。每次循环都会创建一个线程,启动7个进程。在每个进程完成后,程序会等待1秒钟再重新开始。以下是代码片段:
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
main_reader()
函数读取设备并准备显示数据。我没有使用过守护进程。目前,我正在使用多进程技术来保持tkinter GUI在设备工作时不会冻结。那么,使用守护进程也可以实现此目的吗? - GreenSabermain_reader()
只需要几分之一秒的时间,移动processes = []
可能会有所帮助。如果你不这样做,并且让进程列表不断增长,它将快速增长,并且你用来加入进程的循环将首先尝试加入根本没有运行的成千上万个进程,直到最终命中实际正在运行的最新几个。 - Hannu