Python pynput键盘侦听器导致延迟
我正在制作一个程序,通过键盘上的某个键(使用pynput)进行开关。我将键盘侦听器循环放在第一个线程中,将操作循环放在第二个线程中。 问题是,在我启动代码后,它不会立即收听键盘,只会在9-10秒之后。有时它拒绝对Esc按钮做出反应,有时它工作。如何修正滞后?代码可以吗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):
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处理程序正在创建一个新线程。使用多进程而不是线程会使事情变得困难,因为进程无法显式访问它们之外的任何东西。