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

时间:2014-03-12 23:43:04

标签: python multithreading python-2.7

所以我试图利用msvcrt.getch()在程序的任何地方选择退出(不使用KeyBoardInterrupt)。

我的代码目前看起来像这样:

导入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块)的同时运行while循环来检测 q 的按键?

这样,如果用户继续使用该程序,他们只会运行一次。但如果他们点击 q ,那么该程序将退出。

1 个答案:

答案 0 :(得分:1)

您可以在单独的帖子中读取密钥或(更好)use msvcrt.kbhit() as @martineau suggested

#!/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(),即您不会注意到按键直到"做东西"完成循环的当前迭代。如果你需要做一些可能需要很长时间的事情,那么你可能需要在另一个线程中运行它(如果在某些时候阻塞是可接受的,则启动新线程或使用线程池)。