【问题标题】:Python event loop -- multithreading -- How to run two bits of code simultaneously?Python 事件循环——多线程——如何同时运行两段代码?
【发布时间】:2014-03-12 23:43:03
【问题描述】:

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

我的代码目前如下所示:

导入 msvcrt 导入系统

print("随时按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,那么程序就会退出。

【问题讨论】:

  • msvcrt.getch() 会在没有按键被按下时阻塞。正如我在answer 中提到的那样,使用msvcrt.kbhit() 来解决您的另一个问题——它不会阻塞。

标签: python multithreading python-2.7


【解决方案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() 之前,您不会对主线程中的按键做出反应,也就是说,在“do stuff”完成当前循环迭代之前,您不会注意到按键。如果您需要做一些可能需要很长时间的事情,那么您可能需要在另一个线程中运行它(如果可以接受某个时间点的阻塞,则启动新线程或使用线程池)。

【讨论】:

  • 另外,如何切换线程?即,如果我想在第二个线程检测到某个按键时在主代码中执行某些操作,我将如何处理?
猜你喜欢
  • 1970-01-01
  • 2011-03-29
  • 1970-01-01
  • 2016-07-18
  • 2023-03-04
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多