如何更称职地冻结主线程?
例如,有一个无终端 ( .pyw ) (* 1 ) 脚本
import threading
import keyboard
class Test(threading.Thread):
def __init__(self):
super().__init__()
def run(self):
while True:
print("kill me")
def Trigger():
Test().start()
keyboard.add_hotkey("alt+f1", Trigger)
(* 1 ) 即不适合使用终端输入()、msvcrt.getch()等。
其含义是当按下某个组合键时启动一些动作。为此,使用键盘最方便,但是,通过添加热键,主程序当然会结束,这与想法不符。这里主程序应该挂起,因为子线程等待组合被按下(〜键盘被创建,不可修改)。
while True: pass
,将 CPU 提高到 50% 是不可接受的。
while True: time.sleep(2**15)
我想避免(出于教育目的考虑)。
好的。您希望程序流“挂起”。您对此有什么选择?
sleep
,或者在循环中运行一个小的,sleep
以便在您的线程似乎正在等待某些东西时为其他线程提供处理器时间 - 再次,“出于教育目的”不适合您threading
:Event
要么Condition
。他们在这里,似乎很适合你。我们只是无休止地等待,直到事件的标志被设置。几乎没有 CPU 时间。顺便说一句,这是最正确的等待范例之一——我们不会浪费处理器,同时等待标志设置,以便在设置标志后立即执行某些操作。在内部,这是通过特殊的操作系统机制实现的,没有来自指令的“拐杖”
sleep
。