如何在python中从后台线程读取键盘输入?
我有一个偶尔需要键盘输入的背景线程。但是,主线程也从键盘读取输入。当我调用如何在python中从后台线程读取键盘输入?,python,multithreading,python-3.x,input,python-multithreading,Python,Multithreading,Python 3.x,Input,Python Multithreading,我有一个偶尔需要键盘输入的背景线程。但是,主线程也从键盘读取输入。当我调用input()时,主线程获取输入。我试过用锁,但它们对我不起作用 主要流程(仅部分代码): 线程代码: global lock def setlock(j): print("Setting lock ", j) global lock lock = j print("Lock status: ", lock.locked()) success = lock.acquire(blocking=Tr
input()
时,主线程获取输入。我试过用锁,但它们对我不起作用
主要流程(仅部分代码):
线程代码:
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)
整个代码驻留在其中
我刚刚写了另一个最小的例子,锁在这里似乎起作用:
导入线程
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()
,但您可以查看全局状态,看看之后如何处理它 试着发表一篇关于这个问题的文章。您的代码看起来很奇怪,除了锁之外没有线程构造,显然您遗漏了一些关键信息。整个代码都驻留在其中。我正在考虑一个选项,其中线程通过队列或类似的方式向主线程发送请求。主htread以输入响应。我上面提出的建议很有效,尽管感觉非常粗糙。
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()