Многопроцессорная обработка с двумя циклами while. - PullRequest
0 голосов
/ 13 сентября 2018

Используя python 2.7, моя цель состоит в том, чтобы иметь программу, которая запускает два цикла одновременно для управления индикаторами на двух отдельных индикаторах гистограммы (12 сегментов).Светодиоды гистограммы будут отображать уровни O2 и CO2.O2 всегда будет уменьшаться, а CO2 всегда будет увеличиваться.За исключением случаев, когда вы нажимаете кнопку, из-за которой уровни возвращаются к 0 для CO2 и 12 для O2.Есть две кнопки, одна для O2 и одна для CO2.

Я хотел бы запустить многопроцессорность, так как я пробовал многопоточность, и она не супер плавная.Однако, когда я пробую следующую многопроцессорную обработку, я получаю: "Программа все еще работает. Вы хотите ее убить?!" ". Когда я запускаю эквивалент с модулем потоков, он работает (но сноване отлично).

import smbus
import time
import os
from  multiprocessing import Process
from Adafruit_LED_Backpack import BicolorBargraph24
import pygame
from pygame.locals import *

o2ledON = [r, r, r, r, y, y, y, y, y, y, y, y, y, y, y, g, g, g, g, g, g, g, g, g]

Co2ledON = [g, g, g, g, g, y, y, y, y, y, y, y, y, y, y, r, r, r, r, r, r, r, r, r]

def increaseCo2():
  try:
    GPIO.add_event_detect(24, GPIO.FALLING, callback = Co2interrupt, bouncetime=3000)
  except KeyboardInterrupt:
    GPIO.cleanup()
  global co2AlarmSound
  global ReplacingCo2Scrubber
  global Co2ledON
  global Co2Level
  global Co2FullKnown
  while(True):
    if(not ReplacingCo2Scrubber):
      if (Co2Level == 23 and Co2FullKnown == False):
        print "Your Co2 scrubber is toast! Replace your Co2 cartridge!"
        co2AlarmSound.play(loops=3)
        #os.system('aplay alarm1.wav &')
        Co2FullKnown = True
      elif (Co2Level >= 0 and Co2Level <= 23):
        try:
          Co2display.set_bar(Co2Level, Co2ledON[Co2Level])
          Co2display.write_display()
          Co2Level += 1
        except IOError as e:
          print "I/O error({0}): {1}".format(e.errno, e.strerror)
        except:
          print "Unexpected error:", sys.exc_info()[0]
    time.sleep(9)
                
def useoxygen():
  try:
    GPIO.add_event_detect(23, GPIO.FALLING, callback = o2interrupt, bouncetime=3000)   
  except KeyboardInterrupt:
        GPIO.cleanup() 
  global o2AlarmSound
  global RechargingOxygen
  global OxygenLevel
  global OxygenEmptyKnown
  while(True):
    if(not RechargingOxygen):
      if OxygenLevel == 0 and OxygenEmptyKnown == False:
        print "You've run out of Oxygen! Replace your o2 Cartridge!"
        o2AlarmSound.play(loops=3)
        OxygenEmptyKnown = 1
        #os.system('aplay alarm1.wav &')
      elif (OxygenLevel >= 0 and OxygenLevel <= 23):
        try:
          o2display.set_bar(OxygenLevel, b)
          o2display.write_display()
          OxygenLevel -= 1
        except IOError as e:
          print "I/O error({0}): {1}".format(e.errno, e.strerror)
        except:
          print "Unexpected error:", sys.exc_info()[0]
    time.sleep(8)       

#---------------Main Program-----------------------------------

if __name__ == '__main__':

    #This puts the oxygen bargraph up to full, which will eventually decrease to 0
    for index, colour in enumerate(o2ledON):
        o2display.set_bar(index, colour)
        o2display.write_display()
        time.sleep(.1)
        print "o2 level : ",index
  
    o2thread = Process(target=useoxygen)
    Co2thread = Process(target=increaseCo2)
    
    Co2thread.start()
    o2thread.start()
...