2017-01-26 18 views
0

프로그램을 백그라운드에서 계속 실행해야하지만 변경할 지침을받을 수 있어야합니다.외부에서 파이썬 스레드를 제어하십시오.

class receiveTemp (threading.Thread): 
    def __init__(self, out): 
     threading.Thread.__init__(self) 
     self.out = out 

    def run(self): 
     self.alive = True 
     try: 
      while self.alive: 
       rec = send("command") 
       self.out.write(rec) 
     except BaseException as Error: 
      print(Error) 
      pass 

지금 내가 외부 프로그램으로 보낼 명령을 변경해야 내가 다시 데이터를 아두 이노에 데이터를 전송하고 수신이 스레드 실행을 보유하고 있습니다.
Pyro4를 사용해 보았지만 서버에서 실행중인 스레드를 얻은 다음 클라이언트와 함께 제어 할 수없는 것 같습니다.

아이디어가 있으십니까?

+0

"Interprocess Communications"라는 버즈 문구를 찾고 계십니다. 그것이 파이썬의 내부 구조에 기초를두기 때문에 그것이 C로 어떻게 수행되는지 연구하십시오. 다른 옵션들 중에는 소켓, 파이프, 공유 메모리 또는 가능한 경우 (송신하려는 내용이 충분히 제한적일 경우) 신호 처리기를 사용하여 수행 할 수 있습니다. –

+0

Pyro4를 사용하여 "서버에서 실행되는 트레드"를 얻는 데 문제가 있습니까? Pyro4 데몬의 requestloop을 시작하자마자 작업 스레드의 요청을 처리하는 서버 프로세스가 실행됩니다. –

답변

1

Scott Mermelstein의 충고는 훌륭합니다. 프로세스 간 의사 소통을 살펴 보시기 바랍니다. 그러나 당신이 시작하는 간단한 예로서,이 같은 코드를 수정 제안 :

import threading 
import queue 
import sys 
import time 

class receiveTemp (threading.Thread): 
    def __init__(self, out, stop, q): 
     threading.Thread.__init__(self) 
     self.out = out 
     self.q = q 
     self.stop = stop 

    def run(self): 
     while not self.stop.is_set(): 
      try: 
       cmd = self.q.get(timeout=1) 
      except queue.Empty: 
       continue 
      try: 
       rec = send(cmd) 
       self.out.write(rec) 
      except BaseException as Error: 
       print(Error) 
       pass 

stop = threading.Event() 
q = queue.Queue() 

rt = receiveTemp(sys.stdout, stop, q) 
rt.start() 

# Everything below here is an example of how this could be used. 
# Replace with your own code. 
time.sleep(1) 
# Send commands using put. 
q.put('command0') 
q.put('command1') 
q.put('command2') 
time.sleep(3) 
q.put('command3') 
time.sleep(2) 
q.put('command4') 
time.sleep(1) 
# Tell the thread to stop by asserting the event. 
stop.set() 
rt.join() 
print('Done') 

이 코드는 중지해야 스레드에 신호로 threading.Event을 사용합니다. 그런 다음 외부에서 스레드에 명령을 보내는 방법으로 queue.Queue을 사용합니다. 스레드 외부에서 대기열에 명령을 추가하려면 q.put(command)을 사용해야합니다.

나는 이것을 Arduino로 테스트하지 않았고, 명령을 반환 한 테스트 용으로 내 자신의 버전 send을 만들었습니다.