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