[英]Script consuming extreme amounts of CPU
我有一个程序,它在按住鼠标时将鼠标移动特定坐标,并在释放鼠标键时停止它。 然而,下面的代码一次占用了我 90% 以上的 CPU。 如何使下面的代码更高效/占用更少的 CPU 资源?
import pynput
import pyautogui
delta_x = [1,2,3]
delta_y = [3,2,1]
def on_press_start(*args):
if args[-1]:
return False
def on_press_loop(*args):
if not args[-1]:
return False
while True:
i = 0
with Listener(on_click=on_press_start) as listener:
listener.join()
with Listener(on_click=on_press_loop) as listener:
for i in range(len(delta_x)):
pyautogui.move(delta_x[i],delta_y[i])
if not listener.running:
break
print(i)
根据https://pynput.readthedocs.io/en/latest/mouse.html ,
鼠标侦听器是一个 threading.Thread,所有回调都将从该线程调用。
这意味着你创建的 Listener 越多,它创建的 CPU 线程就越多,你有一个 while true 循环,它会创建大量的监听器和大量的线程,因此你的程序占用了太多的 CPU。
哪怕是一个简单的
while True:
pass
循环将使用 100% 的 CPU 内核。 循环内代码的效率只会影响频率。 除非您限制频率,否则它不会影响 CPU 使用率。
在您的情况下,您不需要while
循环来监视鼠标。 库提供的侦听器以更智能的方式为您完成这项工作。 从文档:
# create a listener
listener = mouse.Listener(on_click=on_click)
...
# start listening to clicks
listener.start()
...
# stop listening to clicks
listener.stop()
何时开始/停止监听鼠标事件取决于您的用例。
使用 on_click 和 on_move 事件的示例:
from pynput import mouse
if __name__ == "__main__":
state = {
"left_button_pressed": False
}
def on_click(x, y, button, pressed):
if button == mouse.Button.left:
state["left_button_pressed"] = pressed
print("onclick", x, y, button, pressed)
def on_move(*args):
if state["left_button_pressed"]:
print("on_move", *args)
with mouse.Listener(on_click=on_click, on_move=on_move) as listener:
listener.join()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.