如何从 python 中的后台线程读取键盘输入?

How to read keyboard input from a background thread in python?

我有一个偶尔需要键盘输入的后台线程。然而,主线程也从键盘读取输入。当我调用 input() 时,主线程获取输入。我试过使用锁,但它们对我不起作用。

主要流程(仅部分代码):

def smth(aff):
    af = aff

lock = threading.Lock()

print(lock)

Peer.setlock(lock)

while True:
    lock.acquire(blocking=True, timeout=-1)
    inp = input()
    parse(inp)
    lock.release()

线程代码:

global lock

def setlock(j):
    print("Setting lock ", j)
    global lock
    lock = j

print("Lock status: ", lock.locked())
success = lock.acquire(blocking=True, timeout=-1)
print(success)
print("You are recieving a file, type y to confirm saving:")
print(lock)

if input() == "y":
    path = ""
    print("Input path:")
    path = input()
    if os.path.isfile(path):
        print("File already exists. Type y to confirm:")
        if not input()=="y":
            return
    handle = open(path, "wb")
    filewriters[transferID] = filewg(handle, numberOfPackets)
    filewriters[transferID].send(None)
lock.release()
print(lock)

整个代码驻留在here

我刚刚写了另一个最小的例子,锁似乎在这里工作: 导入线程

lock = threading.Lock()

def th():
    while True:
        lock.acquire(blocking=True, timeout=-1)
        print("Thread prints ", input())
        lock.release()

tic = threading.Thread(target=th)

tic.start()

while True:
    lock.acquire(blocking=True, timeout=-1)
    print("Main prints ", input())
    lock.release()

直接的问题是主线程中的 input() 阻塞并等待持有锁的输入。所以无论你的后台线程什么时候尝试获取输入,主线程已经在持有锁等待输入,第一个输入到主线程。

之后,主线程调用release(),然后立即再次调用acquire()。不幸的是 threading.Lock 不保证公平。即使后台线程在 acquire() 中等待,主线程的后续 acquire() 也有可能首先成功,后台 "jumping the line"线。

退后一步,看看您在 "big picture" 中尝试做什么。您有一个资源(终端输入流),您试图根据程序执行上下文将其定向到两个不同的位置。我会考虑一个模型,其中只有一个线程执行 input() 但您查看全局状态以查看之后如何处理它。