Форум сайта python.su
Цель задачи использовать таймер в роле watchdog, который завершит исполнение скрипта в случае бездействия пользователя или простоя скрипта. Два мои примера ниже, не работаю как я хочу, помогите решить задачу.
Тут по exit(0) работа не завершается.
import threading import msvcrt import time stop = True def time_th(): global stop while stop: stop = False for i in range(5,0,-1): time.sleep(2) print(i) exit(0) trh = threading.Thread(target=time_th) trh.start() key = None while key != b'\x1b': key = msvcrt.getch() stop = True print(key)
import threading import msvcrt import time class time_(threading.Thread): def __init__(self, ): super(time_, self).__init__() self.t_worck = True def run(self): while self.t_worck: self.t_worck = False for i in range(5,0,-1): time.sleep(2) print(i) exit(0) def m_continue(self): self.t_worck = True timer = time_() timer.run() key = None while key != b'\x1b': key = msvcrt.getch() timer.m_continue() print(key)
Отредактировано Anatolich (Янв. 27, 2019 13:54:49)
Офлайн
Господа специалисты, неужели непосильная задача для вас или для Python-а?
Офлайн
Anatolichдавайте по порядку, как вы хотите чтобы оно работало?
Два мои примера ниже, не работаю как я хочу, помогите решить задачу.
Anatolichа что должна? у вас же еще цикл while key != b'\x1b': крутится, и программа не завершит свою работу пока key != b'\x1b'
Тут по exit(0) работа не завершается.
[code python][/code]
Офлайн
давайте по порядку, как вы хотите чтобы оно работало?
Отредактировано Anatolich (Янв. 28, 2019 17:16:29)
Офлайн
Anatolich ой шото вы недоговаривате, ибо я испытываю когнитивный диссонанс читая:
Anatolichи
Есть удаленный linux сервер
Anatolichmsvcrt виндовая приблуда и под линуксом работать не будет.
import msvcrt
#!/usr/bin/python3 # -*- coding: utf-8 -*- import os import signal import time IDLE_TIMEOUT = 10 # таймаут бездействия в секундах CHECK_INTARVAL = 2 # интерал проверки таймаута в секундах def handler(signum, frame): idle_time = time.time() - last_activity # время простоя if idle_time > IDLE_TIMEOUT: # если время простоя больше таймаута бездействия exit(0) else: # иначе запустить повторно проверку через CHECK_INTARVAL секунд signal.alarm(CHECK_INTARVAL) signal.signal(signal.SIGALRM, handler) signal.alarm(CHECK_INTARVAL) last_activity = time.time() key = None while key != 'b': # тут выполняется какаято работа key = input('press a key') last_activity = time.time() print(key)
[code python][/code]
Отредактировано PEHDOM (Янв. 29, 2019 10:15:48)
Офлайн
Что то я не понял. Говорите сервер на линуксе, при этом используете msvcrt
msvcrt — Useful routines from the MS VC++ runtimeЭто не должно работать.
These functions provide access to some useful capabilities on Windows platforms.
Офлайн
PEHDOM
я сперва тоже хотел предложить ровно то, но после того как увидел о том что там используется msvcrt изменил мнение, в торону более простого. (ну как то “не уровень” у ТС, может и тот код не сам писал, а взял откуда то)
Офлайн
Господа не зацикливайтесь на msvcrt, это примеры, их я тестил на Win.
А вообще желательно решение кроссплатформенное (Возможна предстоит работа на удаленных Win серверах) и на python2.7
Отредактировано Anatolich (Янв. 30, 2019 10:57:30)
Офлайн
AnatolichА чем не устраивают три предложеных выше решения?
А вообще желательно решение кроссплатформенное и на python2.7
[code python][/code]
Офлайн
А кто сказал, что не устраивает? Я до утончил задачу и пояснил использовании msvcrt.
Оно собственно и с os._exit(0) работает, пост #3.
Отредактировано Anatolich (Янв. 30, 2019 10:45:16)
Офлайн