如何使该脚本安全地加热我的CPU

时间:2019-05-07 23:59:52

标签: python hardware python-multiprocessing cpu-usage

我想使用我发现的这个脚本来加热CPU,但是无法安全地确保它不会过热。

import multiprocessing
import sys

def round_robin_count():
    while(True):
        number = 0
        if(number >= sys.maxsize):
            number = 0
        else:
            number = number + 1


if len(sys.argv) == 2 and sys.argv[1] == '--about':
    print(__doc__)
elif len(sys.argv) == 2 and sys.argv[1] == '--help':
    print('Heater', 'USAGE: python3 ' + sys.argv[0] + ' [option]', sep='\n')
    print('To read about.', 'python3 ' + sys.argv[0] + ' --about' ,sep='  ')
    print('To see this help message.', 'python3 ' + sys.argv[0] + ' --help', sep='  ')
else:
    process_count = 1
    print('Heating up the CPU')
    while(process_count <= multiprocessing.cpu_count()):
        process_to_be_not_seen_again = multiprocessing.Process(target=round_robin_count)
        process_to_be_not_seen_again.start()
        process_count += 1

用Python编写的this script可以安全地温和加热计算机以消除任何错误吗?即使有可能(或安全),似乎也无法控制将鼠标悬停在什么温度上。如果不安全,可以安全吗?

2 个答案:

答案 0 :(得分:2)

为使脚本安全,建议您为CPU设置一个截止温度。您可以使用内置的psutil

来检查CPU的温度
import psutil
print(psutil.sensors_temperatures())

输出:

{'coretemp': [shwtemp(label='Package id 0', current=55.0, high=82.0, critical=100.0), shwtemp(label='Core 0', current=35.0, high=82.0, critical=100.0), shwtemp(label='Core 1', current=34.0, high=82.0, critical=100.0), shwtemp(label='Core 2', current=55.0, high=82.0, critical=100.0), shwtemp(label='Core 3', current=34.0, high=82.0, critical=100.0), shwtemp(label='Core 4', current=35.0, high=82.0, critical=100.0), shwtemp(label='Core 5', current=34.0, high=82.0, critical=100.0)]}

因此,您需要编写一个可以引用此脚本的脚本,并确保没有内核达到临界温度。

所以也许在while循环中,您可以这样修改

critical_temp = 80.0
keep_heating = True
cpu_temperatures = psutil.sensors_temperatures()

for cpu_temp in cpu_temperatures['coretemp']:
   if cpu_temp >= critical_temp:
       keep_heating = False    

然后while循环可能包含keep_heating作为条件。

while process_count <= multiprocessing.cpu_count() and keep_heating:
    process_to_be_not_seen_again = multiprocessing.Process(target=round_robin_count)
    process_to_be_not_seen_again.start()
    process_count += 1
    some_function_to_recheck_heat()

可能还添加了一个杀死进程的功能。

答案 1 :(得分:1)

一个对我有用的简单闭环控制器,只是忙着循环检查温度

首先引入一些有用的库并定义一个助手:

from random import random
from time import sleep
from multiprocessing import Pool, cpu_count
from psutil import sensors_temperatures

def cpu_temps():
    return sensors_temperatures()['coretemp']

然后,我定义了一个功能,该功能可以在CPU“过热”(由target_temp定义)时工作并进入睡眠状态:

target_temp = 66  # or min(t.high for t in cpu_temps())

def warmer(i):
    while True:
        cur_temp = max(t.current for t in cpu_temps())
        if cur_temp > target_temp:
            sleep(1 + random() * i)

1 + random() * i可以帮助防止温度下降到目标温度以下的所有CPU旋转

然后我通过滥用Pool中的multiprocessing来结束它,以便它可以完成设置流程并将其整洁地拆除的所有工作:

print('sensor names:', ', '.join(t.label for t in cpu_temps()))

nprocs = cpu_count()
with Pool(nprocs) as pool:
    jobs = pool.imap(warmer, range(nprocs))

    while True:
        print('current temps:', ', '.join(f'{t.current:.0f}' for t in cpu_temps()))
        sleep(1)

这显然会每秒打印出当前温度,但是可以更改或将其设置为命令行参数,例如argparse