Lego-EV3: Как исправить ошибку EOFError при перехвате пользовательского ввода с помощью многопроцессорной обработки?

В настоящее время я работаю с лего-роботом EV3, который управляется несколькими нейронами. Теперь я хочу изменить код (работающий на python3) таким образом, чтобы можно было изменять определенные значения параметров во время работы через оболочку (Ubuntu), чтобы манипулировать динамика робота в любое времямногократно). Вот схема того, чего я достиг на данный момент, на основе короткого примера кода:

from multiprocessing import Process
from multiprocessing import SimpleQueue
import ev3dev.ev3 as ev3

class Neuron:
    (definitions of class variables and update functions)

def check_input(queue):
    while (True):
        try:
            new_para = str(input("Type 'parameter=value': "))
            float(new_para[2:0])  # checking for float in input
            var = new_para[0:2]

            if (var == "k="):  # change parameter k
                queue.put(new_para)
            elif (var == "g="):  # change parameter g
                queue.put(new_para)
            else:
                print("Error". Type 'k=...' or 'g=...')
                queue.put(0)  # put anything in queue
        except (ValueError, EOFError):
            print("New value is not a number. Try again!")

(some neuron-specific initializations)

queue = SimpleQueue()
check = Process(target=check_input, args=(queue,))
check.start()

while (True):
    if (not queue.empty()):
        cmd = queue.get()
        var = cmd[0]
        val = float(cmd[2:])

        if (var == "k"):
            Neuron.K = val
        elif (var == "g"):
            Neuron.g = val

    (updating procedure for neurons, writing data to file)

Поскольку я новичок в многопроцессорной обработке, конечно, есть некоторые ошибки, связанные с блокировкой, эффективностью и т. Д., Но робот движется, и поля ввода возникают в оболочке. Однако текущая проблема заключается в том, что на самом деле невозможно сделать ввод:

> python3 controller_multiprocess.py
> Type 'parameter=value': New value is not a number. Try again!
> Type 'parameter=value': New value is not a number. Try again!
> Type 'parameter=value': New value is not a number. Try again!
> ... (and so on)

Я знаю, что такое поведение вызвано выставлением исключения EOFError из-за того, что эта ошибка возникает при удалении исключения (и сбое процесса). Следовательно, программа просто прогоняет здесь цикл try и предполагает, что ввод (-> пустая строка) не производился снова и снова. Почему это происходит? - когда не вызывается как потоковая процедура, программа терпеливо ожидает ввода, как и ожидалось. И как можно исправить или обойти эту проблему, чтобы изменение параметров стало возможным?

Заранее спасибо!


person catalyst    schedule 30.08.2017    source источник
comment
Я надеюсь, что ответы здесь помогут: stackoverflow.com/questions/30134297/   -  person ensonic    schedule 31.08.2017
comment
Да, большое спасибо за то, что указали мне на соответствующую проблему, которая мне нужна для решения моей проблемы! @энсоник   -  person catalyst    schedule 01.09.2017