Nano Hash - криптовалюты, майнинг, программирование

Запуск и сброс таймера Python

Я пытаюсь заставить функцию таймера работать в Python (в настоящее время Python 2.7).

Вот что у меня есть до сих пор. Я борюсь с проблемой потоковой передачи и сбросом таймера.

from threading import Timer

def api_call():
    print("Call that there api")

t = Timer(10.0,api_call)


def my_callback(channel):

    if something_true:
        print('reset timer and start again')
        t.cancel()
        t.start()
        print("\n timer started")
    elif something_else_true:
        t.cancel()
        print("timer canceled")
    else:
       t.cancel()
       print('cancel timer for sure')

try:
    if outside_input_that_can_happen_a_lot:
        my_callback()

finally:
    #cleanup objects

По сути, my_callback() может вызываться очень много раз очень быстро и может попасть в любую часть операторов "if", "elif" или "else".

Проблема, с которой я сталкиваюсь, заключается в том, что когда переменная something_true имеет значение true, она запускает таймер. Что прекрасно работает в первый раз. Каждый раз после того, как он вызывается, я получаю сообщение об ошибке потоковой передачи, говорящее мне, что для таймера можно использовать только один поток.

По сути, я хочу иметь возможность сбросить свой таймер при первом «если» и отменить, если «элиф» или «еще» нажаты.


  • Пожалуйста, добавьте более конкретный код вместо outside_input_that_can_happen_a_lot и something_true и т. д. 12.06.2019
  • Привет @Devesh, я пытался сделать это как можно проще. Какой код вы хотите? 12.06.2019
  • Вы можете попробовать, если мое решение здесь работает для вас, оно выполняет сброс за вас, и вы можете просто timelord.reset(interval). 12.06.2019

Ответы:


1

Основываясь на моем тестировании, это связано с тем, что потоки могут быть запущены только один раз, а поскольку таймер зависит от потока, таймер может быть запущен только один раз. Это означает, что единственный способ перезапустить таймер - это сделать:

def newTimer():
    global t
    t = Timer(10.0,api_call)
newTimer()

вместо части t = Timer и выполните

t.cancel()
newTimer()
t.start()

вместо текущего кода перезапуска.

Это делает ваш полный код:

from threading import Timer

def api_call():
    print("Call that there api")

def newTimer():
    global t
    t = Timer(10.0,api_call)
newTimer()


def my_callback(channel):

    if something_true:
        print('reset timer and start again')
        t.cancel()
        newTimer()
        t.start()
        print("\n timer started")
    elif something_else_true:
        t.cancel()
        print("timer canceled")
    else:
       t.cancel()
       print('cancel timer for sure')

try:
    if outside_input_that_can_happen_a_lot:
        my_callback()

finally:
    #cleanup objects

Надеюсь это поможет.

12.06.2019
  • Привет @crazysqueak, значит ли это, что у меня может быть создано множество таймеров? Итак, каждый раз, когда это вызывается, у меня есть 1 + n таймеров? Или только 1 таймер еще? 12.06.2019
  • Python автоматически удаляет объекты (например, таймеры), на которые не ссылаются какие-либо переменные. Когда запускается newTimer(), t устанавливается на новый таймер, а старый таймер отбрасывается, так как на него больше не ссылаются никакие переменные. Это означает, что это будет только 1 таймер. 12.06.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..