Как работает Timer в Python в отношении многопоточности? - PullRequest
1 голос
/ 23 января 2010

Если я позвоню

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

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

1 Ответ

3 голосов
/ 23 января 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...