2017-01-26 3 views
0

У меня есть программа, которая должна постоянно работать в фоновом режиме, но иметь возможность получать инструкции для изменения. У меня есть эта нить работает, которая передает данные в Arduino и получает данные обратно:Управление потоком python извне

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, но я не могу заставить Thread работать на сервере, а затем контролировать его с клиентом.

Любые идеи?

+0

Вы ищете фразу «Interprocess Communications». Изучите, как это делается на C, так как на самом деле основано большинство встроенных функций python. Среди других опций вы можете сделать это с помощью сокетов, труб, общей памяти или, возможно, (если то, что вы хотите отправить, достаточно ограничено), обработчик сигнала. –

+0

В чем проблема с получением «протектора на сервере» с помощью Pyro4? Как только вы запустите requestloop демона Pyro4, он запускает серверный процесс, обрабатывающий запросы в рабочих потоках. –

ответ

1

Совет Скотта 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 для тестирования, которая только что вернула команду.

Смежные вопросы