Member 13983803 Ответов: 0

Помощь в многопроцессорной обработке? Я продолжаю получать: "программа все еще работает. Ты хочешь его убить? ! "


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

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

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

GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(0)

bus = smbus.SMBus(1) 

#Setting up sound effects
pygame.mixer.init()

#O2 and CO2 Sounds
alarm1Sound = pygame.mixer.Sound("/home/pi/Modules/alarm1.wav")
co2AlarmSound = pygame.mixer.Sound("/home/pi/Modules/alert.wav")
o2AlarmSound = pygame.mixer.Sound("/home/pi/Modules/alert.wav")

#---------------------Setting up GPIOs.-----------------#

GPIO.setup(23, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(24, GPIO.IN, pull_up_down=GPIO.PUD_UP)

###########################LED Set up######################################

#-O2 & CO2 Bargraph LED
o2display = BicolorBargraph24.BicolorBargraph24(address=0x71)
Co2display = BicolorBargraph24.BicolorBargraph24(address=0x74)

# Initialize the display. 
o2display.begin()
Co2display.begin()
o2display.write_display()
Co2display.write_display()

#----------------O2 & CO2 Bargraph LED Variables--------------------------

RechargingOxygen=False
ReplacingCo2Scrubber=False

OxygenLevel = 0
OxygenEmptyKnown = False
Co2Level = 0
Co2FullKnown = False

g = BicolorBargraph24.GREEN
y = BicolorBargraph24.YELLOW
r = BicolorBargraph24.RED
b = BicolorBargraph24.OFF

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()


Что я уже пробовал:

Я уже использовал этот поток с помощью многопоточности, и он работает, но не так хорошо.

Richard MacCutchan

Что вы подразумеваете под многопроцессорной обработкой? Вы запускаете две копии одной и той же программы одновременно?

Member 13983803

Привет, Ричард, спасибо, что нашел время прочитать мой вопрос. Я имею в виду, что я хотел бы запустить многопроцессорный модуль из python, чтобы одновременно запускать две функции одновременно. В этом случае двумя функциями являются 1) useoxgen и 2) increaseCo2. Оба цикла while в этих функциях выполняются одновременно.

Richard MacCutchan

Извини, что я никогда этим не пользовался. Я предлагаю вам взглянуть на 17.2. многопроцессорная обработка — параллелизм на основе процессов- документация Python 3.4.9[^]

0 Ответов