如何使用python限制特定第3方进程的最大CPU消耗?

问题描述 投票:0回答:0

我试图限制第 3 方进程在 python 中运行时的最大 CPU 消耗。我发现了另一篇 stackoverflow 帖子,显然有一个工作示例,但它是用 C# 编写的,地址为 https://stackoverflow.com/a/31361144/15163882

我尝试使用 ctypes 在 python 中复制它,但我的代码似乎并没有限制 cpu 消耗。它所做的只是打印出“错误!”,表明它失败了,但仅此而已。我知道这绝对不是权限问题,因为即使运行此代码提升到系统权限进程(使用psexec)也不会执行任何操作。

我可以获得任何帮助吗?

from ctypes import *
from ctypes.wintypes import *

PROCESS_SET_QUOTA = 0x0100
PROCESS_TERMINATE = 0x0001

kernel32 = WinDLL('kernel32', use_last_error=True)

OpenProcess = kernel32.OpenProcess
OpenProcess.restype = HANDLE
OpenProcess.argtypes = (DWORD, BOOL, DWORD)

class SECURITY_ATTRIBUTES(Structure):
    _fields_ = (('nLength', DWORD),
                ('lpSecurityDescriptor', LPVOID),
                ('bInheritHandle', BOOL))

    def __init__(self, *args, **kwds):
        super(SECURITY_ATTRIBUTES, self).__init__(*args, **kwds)
        self.nLength = sizeof(self)
        self.bInheritHandle = True
        self.lpSecurityDescriptor = None

LPSECURITY_ATTRIBUTES = POINTER(SECURITY_ATTRIBUTES)

CreateJobObjectW = kernel32.CreateJobObjectW
CreateJobObjectW.restype = HANDLE
CreateJobObjectW.argtypes = (LPSECURITY_ATTRIBUTES, LPCWSTR)

AssignProcessToJobObject = kernel32.AssignProcessToJobObject
AssignProcessToJobObject.restype = BOOL
AssignProcessToJobObject.argtypes = (HANDLE, HANDLE)

SetInformationJobObject = kernel32.SetInformationJobObject
SetInformationJobObject.restype = BOOL
SetInformationJobObject.argtypes = (HANDLE, DWORD, LPVOID, DWORD)

class JOBOBJECTINFOCLASS:
    JobObjectAssociateCompletionPortInformation = 7
    JobObjectBasicLimitInformation = 2
    JobObjectBasicUIRestrictions = 4
    JobObjectEndOfJobTimeInformation = 6
    JobObjectExtendedLimitInformation = 9
    JobObjectSecurityLimitInformation = 5
    JobObjectCpuRateControlInformation = 15

class CpuFlags:
    JOB_OBJECT_CPU_RATE_CONTROL_ENABLE = 0x00000001
    JOB_OBJECT_CPU_RATE_CONTROL_WEIGHT_BASED = 0x00000002
    JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP = 0x00000004

class JOBOBJECT_CPU_RATE_CONTROL_INFORMATION(Structure):
    _fields_ = (('ControlFlags', DWORD),
                ('CpuRate', DWORD),
                ('Weight', DWORD))



process_id = 10464 # process id
max_cpu_consumption = 1 # max cpu consumption in %

process_handle=OpenProcess(PROCESS_SET_QUOTA | PROCESS_TERMINATE, False, process_id)
job_handle=CreateJobObjectW(None,None)
AssignProcessToJobObject(job_handle,process_handle)

cpu_limits=JOBOBJECT_CPU_RATE_CONTROL_INFORMATION()
cpu_limits.ControlFlags=CpuFlags.JOB_OBJECT_CPU_RATE_CONTROL_ENABLE | CpuFlags.JOB_OBJECT_CPU_RATE_CONTROL_HARD_CAP
cpu_limits.CpuRate=max_cpu_consumption*100

if not SetInformationJobObject(job_handle,JOBOBJECTINFOCLASS.JobObjectCpuRateControlInformation,byref(cpu_limits),sizeof(cpu_limits)):
    print("Error !")

我也尝试使用 pywin32 并尝试限制进程的 cpu 消耗,类似于 this stackoverflow post 上的描述,但它甚至没有实现

JobObjectCpuRateControlInformation

python c# winapi limit cpu-usage
© www.soinside.com 2019 - 2024. All rights reserved.