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-loop ที่นี่ และถือว่าไม่มีการสร้างอินพุต (-> สตริงว่าง) ซ้ำแล้วซ้ำอีก ทำไมสิ่งนี้ถึงเกิดขึ้น? - เมื่อไม่ถูกเรียกว่าเป็นโพรซีเดอร์แบบเธรด โปรแกรมจะอดทนรออินพุตตามที่คาดไว้ และเราจะแก้ไขหรือหลีกเลี่ยงปัญหานี้ได้อย่างไรเพื่อให้การเปลี่ยนแปลงพารามิเตอร์เป็นไปได้ตามต้องการ

ขอบคุณล่วงหน้า!


person catalyst    schedule 30.08.2017    source แหล่งที่มา
comment
ฉันหวังว่าคำตอบที่นี่จะช่วย: stackoverflow.com/questions/30134297/   -  person ensonic    schedule 31.08.2017
comment
ใช่แล้ว ขอบคุณมากที่ชี้ให้ฉันทราบถึงปัญหาที่เหมาะสมซึ่งฉันต้องการในการแก้ปัญหา! @ensonic   -  person catalyst    schedule 01.09.2017