(python) Разное поведение при вызове с использованием threading.Timer
Я хочу сделать небольшой музыкальный проигрыватель командной строки на основе модуля Python "mp3play". Я хочу регулярно проверять, не прекратилось ли воспроизведение песни (и, в конечном итоге, начать новую песню), но пользователь должен иметь возможность вводить новые команды в течение этого времени (например, приостановка воспроизведения музыки). Поэтому я попытался использовать threading. Timer для этого. Тем не менее, это дает мне ошибку, если я нахожусь внутри функции, которая была вызвана с использованием таймера. ошибка не возникает при нормальном вызове функции. Вот мой (уменьшенный) код:
from threading import Timer
global currentmusic
def rep():
b = currentmusic.isplaying() #this is where the error occurs
if b:
print "Music is playing"
else:
print "Music has stopped"
t=Timer(5.0,rep) #repeat every 5 seconds
t.start()
currentmusic=playrandomfile() #loads a song and starts playing it
rep() #call the first time
Когда rep() вызывается во второй раз, это дает мне ошибку MCI в функции isplaying(), говоря, что она не может прочитать устройство. Мои вопросы:
Я делаю ошибку с тем, как работает threading.
Timer? (и как я могу это исправить?) Есть ли другой способ, кроме threading.
Timer, чтобы добиться того, что я хочу?
Мои мысли до сих пор были, что это может быть проблемой для доступа currentmusic
из другой ветки, но я не уверен. Также я не знаю, как этого избежать.
Спасибо за помощь
1 ответ
Я использовал mp3play в некоторых проектах, и он прекрасно работает для меня. ИМО рекурсивная многопоточность является проблемой. Просто удалите таймер потоков и оставьте вызов функции rep, он не будет отставать от любого ПК. Вы должны использовать потоки только для raw_input.