Lego-EV3: Bagaimana cara memperbaiki EOFError saat menangkap input pengguna melalui multiprosesing?

Saat ini saya sedang mengerjakan robot lego EV3 yang dikendalikan oleh beberapa neuron. Sekarang saya ingin memodifikasi kode (berjalan di python3) sedemikian rupa sehingga seseorang dapat mengubah nilai parameter tertentu saat dijalankan melalui shell (Ubuntu) untuk memanipulasi dinamika robot setiap saat (dan beberapa kali). Berikut adalah skema dari apa yang telah saya capai sejauh ini berdasarkan contoh kode singkat:

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)

Karena saya baru mengenal multiprosesor, pasti ada beberapa kesalahan terkait penanganan penguncian, efisiensi, dan sebagainya, tetapi pergerakan robot dan kolom input terjadi di shell. Namun, masalah saat ini adalah tidak mungkin membuat masukan:

> 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)

Saya tahu bahwa perilaku ini disebabkan oleh penempatan pengecualian EOFError karena kesalahan ini terjadi ketika pengecualian dihapus (dan prosesnya terhenti). Oleh karena itu, program hanya berjalan melalui try-loop di sini dan mengasumsikan bahwa tidak ada input (-> string kosong) yang dibuat berulang kali. Mengapa ini terjadi? - bila tidak dipanggil sebagai prosedur berulir, program dengan sabar menunggu masukan seperti yang diharapkan. Dan bagaimana cara memperbaiki atau mengatasi masalah ini sehingga perubahan parameter dapat dilakukan sesuai keinginan?

Terima kasih sebelumnya!


person catalyst    schedule 30.08.2017    source sumber
comment
Saya harap jawaban di sini akan membantu: stackoverflow.com/questions/30134297/   -  person ensonic    schedule 31.08.2017
comment
Ya, terima kasih banyak telah mengarahkan saya ke masalah yang sesuai yang saya perlukan untuk menyelesaikan masalah saya! @ensonik   -  person catalyst    schedule 01.09.2017