gpt4 book ai didi

Python:如何阻止线程/多处理使用 100% 的 CPU?

转载 作者:太空宇宙 更新时间:2023-11-03 11:19:38 25 4
gpt4 key购买 nike

我的代码可以在无限长的时间内每秒从 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

但是,这会占用我 100% 的 CPU。这是线程和多处理的设计还是只是糟糕的编码?有什么方法可以限制 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 只需几分之一秒即可运行,这意味着进程创建开销可能会导致您的问题。

这是一个使用multiprocessing.Pool 的例子。这将创建一个工作池并将您的任务提交给他们。如果这是一个无限循环,进程只会启动一次并且永远不会关闭或加入。如果你想关闭你的池,你可以通过加入和关闭它来实现(参见文档)。

from multiprocessing import Pool, Manager
from time import sleep
import threading
from random import random

gas_list = [1,2,3,4,5,6,7,8,9,10]

def main_reader(sen, rqu):
output = "%d/%f" % (sen, random())
rqu.put(output)


def all_processes(rq):
p = Pool(len(gas_list) + 1)
while True:
for sen in gas_list:
p.apply_async(main_reader, args=(sen, rq))

sleep(1)

m = Manager()
q = m.Queue()
t = threading.Thread(target=all_processes, args=(q,))
t.daemon = True
t.start()

while True:
r = q.get()
print r

如果这没有帮助,您需要开始更深入地挖掘。我会首先将无限循环中的 sleep 时间增加到 10 秒甚至更长。这将允许您监视程序的行为。如果 CPU 出现峰值,然后稳定下来 10 秒左右,您就知道问题出在您的 main_reader 中。如果它仍然是 100%,则您的问题一定出在其他地方。

有没有可能你的问题根本不在程序的这一部分?您似乎是在一个线程中启动这一切,这表明您的主程序正在做其他事情。这会不会是其他东西使 CPU 达到峰值?

关于Python:如何阻止线程/多处理使用 100% 的 CPU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45590612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com