Python 事件循环 -- 多线程 -- 如何同时运行两段代码?

0 投票
1 回答
1125 浏览
提问于 2025-04-17 22:02

我想用 msvcrt.getch() 来实现一个随时可以退出程序的选项(不使用键盘中断)。

我现在的代码是这样的:

import msvcrt
import sys

打印“随时按 q 退出”

while True:
    pressedKey = msvcrt.getch()
    if pressedKey == 'q':    
       sys.exit()
    else:
       # do some setup
       if myvar == "string":
           try:
               # do stuff
           except:
               # do stuff 
       else:
           #do stuff

我该怎么做才能在运行其他代码(也就是 # do stuff 的部分)时,同时检测用户是否按下了 q 键呢?

这样的话,如果用户继续执行程序,代码只会运行一次。但如果他们按下了 q,程序就会退出。

1 个回答

1

你可以在一个单独的线程中读取按键,或者更好的是,使用 msvcrt.kbhit(),正如 @martineau 建议的那样

#!/usr/bin/env python
import msvcrt
from Queue import Empty, Queue
from threading import Thread

def read_keys(queue):
    for key in iter(msvcrt.getch, 'q'): # until `q`
        queue.put(key)
    queue.put(None) # signal the end

q = Queue()
t = Thread(target=read_keys, args=[q])
t.daemon = True # die if the program exits
t.start()

while True:
    try:
        key = q.get_nowait() # doesn't block
    except Empty:
        key = Empty
    else:
        if key is None: # end
            break
    # do stuff

如果我想在主代码中做一些事情,当第二个线程检测到某个按键被按下时,我该怎么做呢?

在主线程中,你不会对按键反应,直到代码再次到达 q.get_nowait() 这一行,也就是说,直到“做事情”完成当前循环的这一轮,你才会注意到按键。如果你需要做一些可能需要很长时间的事情,那么你可能需要在另一个线程中运行它(如果在某个时刻阻塞是可以接受的,可以启动新线程或使用线程池)。

撰写回答