Потоки на микропитоне EV3
Я пытаюсь написать код для своего блока EV3. Я действительно изо всех сил пытаюсь заставить многопоточность работать. Я использую модуль потоковой передачи, он не выдает ошибок, но функции, которые должны выполняться в другом потоке, вообще не запускаются. Мой код:
#!/usr/bin/env pybricks
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import Port, Stop, Direction, Button, Color
from pybricks.tools import wait, StopWatch, DataLog
from pybricks.robotics import DriveBase
from pybricks.media.ev3dev import SoundFile, ImageFile
import threading
# Create your objects here.
ev3 = EV3Brick()
def color_thread():
print("color_thread")
ev3.light.on(Color.ORANGE)
wait(100)
ev3.light.on(Color.GREEN)
wait(100)
def speaker_thread():
print("speaker_thread")
ev3.speaker.beep(200,100)
wait(100)
ev3.speaker.beep(500,100)
wait(100)
t1 = threading.Thread(target=color_thread)
t2 = threading.Thread(target=speaker_thread)
t1.start()
t2.start()
Таким образом, ожидаемый результат будет следующим:
color_thread
speaker_thread
и некоторая видимая и слышимая индикация (изменение света и звуки), но вывод:
Starting: brickrun --directory="/home/robot/olgojChorchoj_Stropochod" "/home/robot/olgojChorchoj_Stropochod"
----------
----------
Completed successfully.
и никаких других указаний на то, что эти две функции работают.
Можете ли вы сказать мне, что я делаю неправильно? спасибо
1 ответ
Проблема в том, что программа завершается до того, как потоки успевают запуститься. Поскольку вы не запускаете какой-либо трудоемкий код во время выполнения потоков, потокам, так сказать, нечего «запускать», поэтому они просто немедленно завершаются.
Здесь есть два решения. Сначала я объясню более простой.
Soultuion 1: использование после вызова потоков
Вы можете позвонить
wait()
сразу после вызова потоков. Это дает потокам время для выполнения перед выходом из программы. Вот как будет выглядеть конец программы:
t1.start()
t2.start()
wait(230)
Обратите внимание, что я жду
230
миллисекунды, не
200
, чтобы дать процессору передышку, так как он не очень быстрый.
Решение 2: поставить только
color_thread
в потоке
Другой, и, возможно, менее точный вариант — иметь только
color_thread()
запустить в потоке и вызвать
speaker_thread()
напрямую. Вот как будет выглядеть конец программы:
# Create only one thread, for color_thread
thread = threading.Thread(target=color_thread)
# Start color_thread, and call speaker_thread directly
thread.start()
speaker_thread()