El artículo anterior introdujo dos métodos para que los programas Python monitoreen la entrada del teclado en los sistemas Windows, a saber, el teclado y el kit de herramientas pynput, pero ambos métodos encontrarán problemas al controlar servidores Linux de forma remota: Python: Monitoreo en sistemas Windows Dos métodos de entrada del
teclado
Este artículo presenta el método de monitoreo de eventos al abrir un nuevo hilo para realizar el monitoreo de la entrada del teclado durante la ejecución del programa. Este método también se puede usar normalmente cuando se controla un servidor Linux de forma remota.
Primero, para definir un subproceso que pueda controlar activamente su final, debe heredar la clase Subproceso en subprocesamiento y reescribir su método _stop:
import threading
class StoppableThread(threading.Thread):
"""
a stoppable thread, inherit from threading.Thread
"""
def __init__(self, target):
super(StoppableThread, self).__init__(target=target)
def _stop(self):
"""
stop the thread, overwrite method, modified from threading.py
:return:
"""
lock = self._tstate_lock
self._is_stopped = True
self._tstate_lock = None
if not self.daemon:
with threading._shutdown_locks_lock:
threading._shutdown_locks.discard(lock)
Tenga en cuenta aquí que la versión de Python es al menos 3.7 Si usa Python 3.6, se informará un error de que el módulo de subprocesos no tiene el atributo _shutdown_locks_lock:
Defina un evento y escriba la función de destino del hilo de acuerdo con el evento:
# event
event_flag = threading.Event()
event_flag.set()
def thread_target():
"""
thread target function, inspect event flag
:return:
"""
global event_flag
while True:
if event_flag.is_set():
input("Press <enter> to pause:")
event_flag.clear()
event_flag.wait()
Para verificar el efecto, el subproceso principal se cronometra a través del bucle for y el nuevo subproceso monitorea la entrada del teclado:
import time
if __name__ == '__main__':
# thread
thread = StoppableThread(target=thread_target)
thread.start()
tms = time.time()
for i in range(100):
print(i)
time.sleep(0.1)
if not event_flag.is_set():
s = input("Please input something:")
print("You input {}".format(s))
event_flag.set()
tme = time.time()
tm = round(tme - tms, 3)
print()
print("for loop running time: {} s".format(tm))
thread._stop()