Как работает Timer в Python в отношении многопоточности?

1

Если я вызываю

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 (...) не использует повторно потоки, но создает новый каждый раз.

В сочетании с убеждением, что библиотека, которую мы используем, не является потокобезопасной, эти ошибки будут иметь смысл...

Теги:
multithreading

1 ответ

3
Лучший ответ

Вправо: каждый вызов Timer запускает новый поток. Действительно, класс threading.Timer документируется как "поток". Вы можете подтвердить это, прочитав исходный код, строка 707.

Хорошей альтернативой является запуск scheduler в одном потоке, получение запросов через экземпляр Queue.Queue (по сути потокобезопасный) и, по сути, сериализуя их (что также может позаботиться о ваших проблемах с не-поточной безопасностью), не требуя дальнейшей блокировки или синхронизации, в зависимости от того, как вы, естественно, организуете свою общую архитектуру).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню