Помощь в многопроцессорной обработке? Я продолжаю получать: "программа все еще работает. Ты хочешь его убить? ! "
Используя 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[^]