Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中从后台线程读取键盘输入?_Python_Multithreading_Python 3.x_Input_Python Multithreading - Fatal编程技术网

如何在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()