簡體   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