Как уменьшить нагрузку на процессор используя threading?
Есть main файл, и куча вспомогательных модулей, код в которых должен исполнятся в реальном времени, причем одновременно, удалось реализовать это с помощью потоков Thread и циклов While true в них, (я новичок, не кидайте камни), но когда число потоков дошло до 6 одновременно выполняющихся, процессор и все его ядра начали долбится в 100%, если у кого есть более производительное решение параллельного выполнения зацикленных модулей, я был бы очень благодарен
Ниже пример main файла с логикой запуска модулей, только тут одновременно запускаются(имитируют запуск), только 2 модуля, а у меня запускаются 6 модулей
# -*- coding: utf-8 -*-
from threading import Thread
import keyboard
import time
class main:
def __init__(self):
self.start = False
self.stop = False
self.exit = False
def module_one(self):
while True:
if self.start == True:
self.stop = False
while True:
if self.stop == True:
self.start = False
break
time.sleep(1)
print('Start module one')
if self.exit == True:
break
def module_two(self):
while True:
if self.start == True:
self.stop = False
time.sleep(1)
while True:
if self.stop == True:
self.start = False
time.sleep(1)
break
time.sleep(1)
print('Start module two')
if self.exit == True:
break
def run_programm(self):
while True:
if keyboard.is_pressed('9'):
print('Start programm')
self.start = True
while True:
if keyboard.is_pressed('0'):
print('Stop programm')
self.stop = True
break
if keyboard.is_pressed('8'):
self.exit = True
break
if __name__ == "__main__":
object_main = main()
RUN_CYCLES = Thread(target = object_main.run_programm)
RUN_CYCLES.start()
MODULE_ONE_CYCLE = Thread(target = object_main.module_one)
MODULE_TWO_CYCLE = Thread(target = object_main.module_two)
MODULE_ONE_CYCLE.start()
MODULE_TWO_CYCLE.start()
MODULE_ONE_CYCLE.join()
MODULE_TWO_CYCLE.join()
RUN_CYCLES.join()
p.s Требуется писать программу на python 2, пишу её на python 2.7
Ответы (1 шт):
Использовать вместо self.start, self.stop, self.exit, while True и time.sleep, логику основанную на threading.Event
self.start = threading.Event()
if self.start.is_set():
while not self.stop.is_set():
self.start.wait()
и т.п.