Python 事件循环 -- 多线程 -- 如何同时运行两段代码?
我想用 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()
这一行,也就是说,直到“做事情”完成当前循环的这一轮,你才会注意到按键。如果你需要做一些可能需要很长时间的事情,那么你可能需要在另一个线程中运行它(如果在某个时刻阻塞是可以接受的,可以启动新线程或使用线程池)。