如何从 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()
但您查看全局状态以查看之后如何处理它。
我有一个偶尔需要键盘输入的后台线程。然而,主线程也从键盘读取输入。当我调用 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()
但您查看全局状态以查看之后如何处理它。