繁体   English   中英

消耗大量 CPU 的脚本

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM