2014-11-16 6 views
0

LED 컨트롤러 용으로 작은 클래스를 작성 중이며 프로세스로 실행됩니다. 아이디어는 일부 코드가 지속적으로 실행되어 i2c 버스에서 LED를 깜박이는 것입니다.이 클래스 범위 변수가 재귀 함수에서 업데이트되지 않는 이유는 무엇입니까?

저는 OOP에 Python을 처음 접했고 Python에서 Processes를 처음 사용합니다. 저는 파이썬 3.4에서 멀티 프로세싱을 사용하고 있지만, 새로운 프린트 기능 또한 2.7x에서 실행해야합니다.

코드를 실행하면 깜박임 그룹 목록에 영향을 미치기 위해 세 가지를 추가합니다. 그러나 이는 ledblinkloop 함수에서 결코 감지되지 않고 계속 실행되도록 자동으로 호출됩니다.

저는 파이썬에서 근본적으로 뭔가 잘못 이해했다고 생각합니다. 로 실행해야합니다

from multiprocessing import Process, Queue 
import time 

class LedController(Process): 
    def __init__(self):  
     super(LedController, self).__init__() 
     print("ledcontroller started: ",self.name) 
     self.blinkgroup = [0x04,0x05] 

    def run(self): 
     self.ledblinkloop() 

    def led_blink_on(self,led): 
     if(led not in self.blinkgroup): 
      print("LED not in blink group, adding. New blinkgroup length:",len(self.blinkgroup)) 
      self.blinkgroup.append(led) 

    def ledblinkloop(self): 
     print("Length of blinkgroup:",len(self.blinkgroup)) 
     time.sleep(1) 
     self.ledblinkloop() 

class myclass: 
    def __init__(self): 
     ledcontroller = LedController() 
     ledcontroller.start() 

     while(1): 
      time.sleep(5) 
      ledcontroller.led_blink_on(0x08) 
      ledcontroller.led_blink_on(0x09) 
      ledcontroller.led_blink_on(0x10) 
      time.sleep(5) 

if __name__ == "__main__": 

코드 추가 파이썬 프로세스를 산란에 의해 파이썬 3

+0

정확히 여기에 클래스 수준 변수가 있습니까? –

+0

잘못된 이름을 사용하고 있으면 언제든지 편집하십시오. self.blinkgroup = [0x04,0x05]이 (가) 수업 수준 과제가 아니십니까? – Chris

+0

seprate LED 개체가있는 두 개의 프로세스가 있습니다. 그 중 하나에 추가 중이지만 다른 하나는 별도의 프로세스에 있으며 완전히 다른 데이터를 가지고 있습니다. (또한'self.blinkgroup = ...'는 클래스 속성이 아닌 인스턴스 속성입니다.) – BrenBarn

답변

0

멀티 프로세싱 라이브러리 작품이다. 그들은 메모리를 공유하지 않습니다.

멀티 프로세싱 라이브러리에서 Queue을 가져 왔지만 사용하지 않은 것을 확인했습니다. 그 QueueProcess 사이에서 통신 할 수있는 두 가지 방법 중 하나이며 다른 하나는 Pipe입니다.

계속 진행하기 전에 다중 처리 라이브러리에 대해 documentation을 읽는 것이 좋습니다.

+0

위대하고 매우 도움이됩니다. 이 응용 프로그램에 멀티 프로세싱 대신 스레딩을 사용하는 것에 대해 생각해야합니까? – Chris

+0

@Chris 귀하의 필요에 따라 크게 달라질 수 있습니다. 스레딩은 약간 더 쉽지만 파이썬 인터프리터의 한계로 인해 실제로 여러 스레드에서 파이썬 코드를 동시에 실행할 수는 없다. 스레딩은 I/O 환경에서 유용하다 (외부에서 뭔가 기다리고있을 때).) 여러 개의 별도 프로세스를 실행하여이를 우회하는 다중 처리가 작성되었습니다. 이 특별한 경우에는 Multiprocessing.Queue를 아주 쉽게 사용할 수 있어야합니다. –

+0

위대한, 내가 대기열을보고 거기에서 결정하기 위해 매뉴얼을 사용할 것이다. 그러나 나는 여러 가지 일들 (2 모뎀, LED i2c 컨트롤러, GPS 등등)을 돌보기 위해 많은 프로세스를 돌리고 싶다. 나는 멀티 프로세싱이 아마도 방법이라고 생각한다. 가다. – Chris

관련 문제