Python pynput键盘侦听器导致延迟

Python pynput键盘侦听器导致延迟,python,multithreading,python-multithreading,pynput,Python,Multithreading,Python Multithreading,Pynput,我正在制作一个程序,通过键盘上的某个键(使用pynput)进行开关。我将键盘侦听器循环放在第一个线程中,将操作循环放在第二个线程中。 问题是,在我启动代码后,它不会立即收听键盘,只会在9-10秒之后。有时它拒绝对Esc按钮做出反应,有时它工作。如何修正滞后?代码可以吗 from threading import Thread from pynput import keyboard import time flag = False kill = False def on_press(key):

我正在制作一个程序,通过键盘上的某个键(使用pynput)进行开关。我将键盘侦听器循环放在第一个线程中,将操作循环放在第二个线程中。 问题是,在我启动代码后,它不会立即收听键盘,只会在9-10秒之后。有时它拒绝对Esc按钮做出反应,有时它工作。如何修正滞后?代码可以吗

from threading import Thread
from pynput import keyboard
import time

flag = False
kill = False

def on_press(key):
    global flag
    global kill

    if key == keyboard.KeyCode.from_char('a'):
        print('pressed A')
        flag = not flag
    if key == keyboard.Key.esc:
        kill = True
        return False

def thr2():
    print('joining...')
    with keyboard.Listener(on_press=on_press) as listen:
        listen.join()

def thr1():
    while True:
        if kill:
            break
        if flag:
            print('looping....')
            time.sleep(0.4)

if __name__ == "__main__":
    thread1 = Thread(target=thr1)
    thread2 = Thread(target=thr2)
    thread1.start()
    thread2.start()

看起来实际的延迟来自pynput键盘.侦听器上下文处理程序本身。我不能告诉你引擎盖下发生了什么,但延迟并不是来自你管理线程的方式

# pynput library creating keyboard.Listener thread causes the delay
with keyboard.Listener(on_press=on_press) as listen:  
    print('listen thread created')  # This does not happen until after the delay
    listen.join()

您可能需要重新表述该问题,使其特定于pynput键盘。Listener

以下是一个可以很好地处理多处理的解决方案:

import sys
from pynput import keyboard
from time import sleep
from multiprocessing import Process, Event
from functools import partial


def thr2(kill_event, flag_event):

    def on_press(kill_event, flag_event, key):
        if key == keyboard.KeyCode.from_char('a'):
            print('pressed A')
            if flag_event.is_set():
                flag_event.clear()
            else:
                flag_event.set()
        if key == keyboard.Key.esc:
            print('esc')
            kill_event.set()
            sys.exit(0)

    with keyboard.Listener(on_press=partial(on_press, kill_event, flag_event)) as listen:
        listen.join()


def thr1(kill_event, flag_event):
    while True:
        if kill_event.is_set():
            print('kill')
            sys.exit(0)
        if flag_event.is_set():
            print('looping....')
            sleep(0.4)


if __name__ == "__main__":
    kill_event = Event()
    flag_event = Event()

    thread1 = Process(target=thr1, args=(kill_event, flag_event))
    thread2 = Process(target=thr2, args=(kill_event, flag_event))

    thread1.start()
    thread2.start()

    thread1.join()  # Join processes here to avoid main process exit
    thread2.join()

你试过运行代码吗?你也经历过同样的滞后吗?我注意到延迟不会发生,除非我将它放在线程下,但是当我使用多处理,并将线程(target=…)更改为Process(target=…)时,延迟就消失了。但我不能使用多重处理,因为出于某种原因,它不能识别全局变量,而这正是我现在想弄明白的。您是否碰巧知道如何在进程之间传递'flag'和'kill'变量?在线程内和线程外运行时,我都经历过同样的延迟。它已经在线程中这一事实并不重要,因为keyboard.Listen处理程序正在创建一个新线程。使用多进程而不是线程会使事情变得困难,因为进程无法显式访问它们之外的任何东西。