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

时间:2017-08-09 12:22:35

标签: python multithreading multiprocessing

我的代码每秒钟从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

1 个答案:

答案 0 :(得分:2)

正如您在注释中所述,您的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

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

你的问题根本不在你的程序中吗?你似乎在一个线程中启动了这一切,这表明你的主程序正在做其他事情。这可能是其他高峰CPU的东西吗?