Управление потоком питона извне

У меня есть программа, которая должна постоянно работать в фоновом режиме, но иметь возможность получать инструкции по изменению. У меня работает этот поток, который отправляет данные в 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 для тестирования, который только что вернул команду.

Другие вопросы по тегам