В настоящее время я работаю с лего-роботом 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 и предполагает, что ввод (-> пустая строка) не производился снова и снова. Почему это происходит? - когда не вызывается как потоковая процедура, программа терпеливо ожидает ввода, как и ожидалось. И как можно исправить или обойти эту проблему, чтобы изменение параметров стало возможным?
Заранее спасибо!