Если я вызываю
Timer(.1, some_function, [some_arguments]).start()
несколько раз, что именно происходит за кулисами?
Источником нашей проблемы является...
У нас есть метод, по существу:
def move(target):
force = calculateForce(target-getCurrentPosition())
if(force != 0)
setForce(force)
Timer(.1, moveCursor, [tx]).start()
else:
setForce(0)
После установки силы нам необходимо проверить через определенное время, нужно ли ее остановить. (Эта информация относится к/с внешнего физического устройства, которое не запускает события.)
Там странные проблемы в том, сколько времени занимает эта функция, а также мы получаем ошибки "не запускать новый поток" через определенное количество времени.
Это заставляет меня поверить, что Timer (...) не использует повторно потоки, но создает новый каждый раз.
В сочетании с убеждением, что библиотека, которую мы используем, не является потокобезопасной, эти ошибки будут иметь смысл...
Вправо: каждый вызов Timer
запускает новый поток. Действительно, класс threading.Timer
документируется как "поток". Вы можете подтвердить это, прочитав исходный код, строка 707.
Хорошей альтернативой является запуск scheduler в одном потоке, получение запросов через экземпляр Queue.Queue
(по сути потокобезопасный) и, по сути, сериализуя их (что также может позаботиться о ваших проблемах с не-поточной безопасностью), не требуя дальнейшей блокировки или синхронизации, в зависимости от того, как вы, естественно, организуете свою общую архитектуру).