Как мне сделать этот скрипт, который нагревает мой процессор безопасно - PullRequest
0 голосов
/ 08 мая 2019

Я хотел бы использовать этот скрипт, который я нашел, чтобы нагреть мой процессор, однако нет никакого способа безопасно гарантировать, что он не нагревается слишком сильно.

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, безопасным для использования, чтобы осторожно прогреть мой компьютер, чтобы исключить какие-либо ошибки? Кажется, он не контролирует температуру, на которой стоит зависать, если такое вообще возможно (или безопасно). Если это не безопасно, можно ли сделать это безопасным?

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Чтобы сделать сценарий безопасным, я рекомендую установить температуру отсечки для вашего процессора. Вы можете проверить температуру вашего процессора, используя встроенные Pythons psutil

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 голос
/ 08 мая 2019

простой контроллер с обратной связью, который работает для меня, просто занятые циклы, проверяющие температуру

, начнем с добавления некоторых полезных библиотек и определения помощника:

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']

Затем я определяюфункция, которая работает и спит, когда процессоры «слишком горячие» (как определено в 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, чтобы предотвратить вращение всех процессоров при температуренемного опускается ниже цели

Затем я обертываю ее, злоупотребляя 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...