脚本消耗大量 CPU

Script consuming extreme amounts of CPU

我有一个程序,当按住鼠标键时,鼠标会移动一定的坐标,松开鼠标键时,鼠标会停止。然而,下面的代码一次占用了我 CPU 的 90% 以上。我怎样才能让下面的代码更有效率/占用更少的 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,

A mouse listener is a threading.Thread, and all callbacks will be invoked from the thread.

这意味着您创建的 Listener 越多,它创建的 CPU 线程就越多,您有一个 while true 循环,它将创建大量的监听器和大量的线程,因此您的程序正在使用太多了 CPU.

即使是简单的

while True:
    pass

loop 将使用 100% 的 CPU 内核。循环内代码的效率只会影响频率。它不会影响 CPU 的使用,除非你限制频率。

在您的情况下,您不需要 while 循环来监视鼠标。库提供的侦听器以更智能的方式为您完成这项工作。来自 docs:

# create a listener
listener = mouse.Listener(on_click=on_click)

...

# start listening to clicks
listener.start()

...

# stop listening to clicks
listener.stop()

何时 start/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()