脚本消耗大量 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()
我有一个程序,当按住鼠标键时,鼠标会移动一定的坐标,松开鼠标键时,鼠标会停止。然而,下面的代码一次占用了我 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()