Управление потоком питона извне
У меня есть программа, которая должна постоянно работать в фоновом режиме, но иметь возможность получать инструкции по изменению. У меня работает этот поток, который отправляет данные в Arduino и получает данные обратно:
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, но я не могу запустить поток на сервере, а затем контролировать его с помощью клиента.
Есть идеи?
1 ответ
Совет Скотта Мермельштейна хорош, надеюсь, вы посмотрите на межпроцессное взаимодействие. Но в качестве быстрого примера для начала я бы предложил изменить ваш код следующим образом:
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
для тестирования, который только что вернул команду.