gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:03:01 24 4
gpt4 key购买 nike

我有一个偶尔需要键盘输入的后台线程。然而,主线程也从键盘读取输入。当我调用 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()< 也有可能 将首先成功,在后台线程上“跳线”。

退后一步,从“大局”的角度审视您要尝试做的事情。您有一个资源(终端输入流),您试图根据程序执行上下文将其定向到两个不同的位置。我会考虑一个模型,其中只有一个线程执行 input() 但您查看全局状态以查看在那之后如何处理它。

关于python - 如何从 python 中的后台线程读取键盘输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40384802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com