Python: Realice el monitoreo de la entrada del teclado durante la ejecución del programa abriendo un nuevo hilo para monitorear eventos

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:
Error de Python 3.6

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()

Supongo que te gusta

Origin blog.csdn.net/Zhang_0702_China/article/details/124285831
Recomendado
Clasificación