繁体   English   中英

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

[英]Python event loop — multithreading — How to run two bits of code simultaneously?

因此,我试图利用msvcrt.getch()在程序中的任何位置做出退出(不使用KeyBoardInterrupt的选项msvcrt.getch()的选项。

我的代码当前如下所示:

导入msvcrt导入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

如何在运行另一个循环的同时运行while循环以检测q的按键( # do stuff块)?

这样,如果用户继续使用该程序,他们将只运行一次。 但是,如果他们按q ,则程序将退出。

您可以在单独的线程中读取键,也可以(最好) 使用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()之前,您不会对主线程中的按键作出反应,即,直到“ do stuff”完成循环的当前迭代之前,您不会注意到按键。 如果您需要执行可能需要很长时间的操作,则可能需要在另一个线程中运行它(如果可以接受某个时刻的阻塞,则可以启动新线程或使用线程池)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM