Задать вопрос
nextel
@nextel
ненавижу javascript

Как нагрузить процессом только конкретные ядры процессора?

есть скрипт который порождает процессы по количеству ядер -1, 1 ядро оставляем на систему, эти процессы в свою очередь поражда.ют еще по 1 процесссу вот как сделать атк чтоб процессы обрабатывались теми же ядрами что и родители? все процеммы пораждаемые главым классом учень ресурсоемкие и как бы сохранить при этом при всем работоспособность системы хотя бы на 1 ядре.

__author__ = 'nextel'
import os
import multiprocessing
import time

def ochen_mnogo_resursov():
    print('ALARM')
    multiprocessing.Process(target=ochen_mnogo_resursov2).start()

def processs():
    
   pcu=  os.cpu_count()
   wait = True
   count = 0
   while wait:
        while count <pcu:
            multiprocessing.Process(target=ochen_mnogo_resursov).start()
            count=count+1        

if __name__ == '__main__':
      p = multiprocessing.Process(target=processs)
      p.start()
      p.join()
  • Вопрос задан
  • 673 просмотра
Подписаться 4 Оценить 3 комментария
Решения вопроса 2
vilgeforce rdvlip Все есть в юзермоде:
https://en.wikipedia.org/wiki/Processor_affinity
https://msdn.microsoft.com/en-us/library/windows/d...

Так что дело за малым - прокинуть вызов из питона в винапи)) (если речь про винду).
Кстати, эта функция даже в Диспетчере задач есть.
Ответ написан
@inkvizitor68sl
Linux-сисадмин с 8 летним стажем.
Если linux - то через cgroups запускать процесс.
https://docs.oracle.com/cd/E37670_01/E37355/html/o...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
wutiarn
@wutiarn
Питоновскими родными средствами, емнип, этого не сделать. Нужно что-то придумывать на уровне ОС, относительно виртуальной машины python. А вот что касается вашего кода выше - руки оторвать. Говорите, хотите ядро сохранить для работы системы, а сами на месте его и выжираете бесконечным циклом без пауз.

Так что советую влепить в цикл time.sleep хотя бы на 1ms. Помнится, где-то читал про механизм, позволяющий просто отдать поток ОС (без указания задержки), до тех пор пока она не решит снова передать управление в этот поток. Но не нашел. Вероятно, это фишка из java.

А вообще попробуйте сделать, как делают все нормальные люди. Пул процессов размером на 1 меньше кол-ва ядер, а там используйте потоки. Это не гарантирует, что у вас один процесс будет работать постоянно на одном и том же ядре, но гарантирует, что параллельно не будет задействовано более n-1 ядер. В данном случае наличие потоков нас не волнует, так как есть gil, который не даст потокам одного процесса работать параллельно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы