当线程在python3的终端中写入数据时,如何不中断命令的输入?

问题描述 投票:0回答:1

我正在开发一个客户端/服务器 cli 应用程序,我遇到了 python3 的 input() 函数和多线程的问题。

这里是示例代码:

import threading
import time

def thread_function():
    for i in range(10):
        time.sleep(3)
        print(f"[Thread {i}]")


while True:
    thread = threading.Thread(target=thread_function)
    thread.start()
    command = input("input> ")
    print("Command:",super1)

此代码提示命令并输出它,同时线程正在运行并随机时间(在本例中每 3 秒)在屏幕上显示数据。当我在提示中输入值时,如果线程显示信息,我的输入将被分成两半,如下所示(例如 whoami):

input> who[Thread 0]
ami
Command:whoami

我正在寻找一种方法来获得类似的东西:

intput> who
[Thread 0]
intput> whoami

在此示例中,我将在线程输出之前键入命令的开头,然后在线程输出之后完成它。它还必须支持“删除”键。

线程数据必须是完全交互的,当线程需要显示信息时,必须同时显示在cli控制台中(不能等待输入函数结束)。

我已经尝试使用 sys.stdin 和 readchar,但我没有找到实现此目的的好方法。

如果有人有想法来实现这种事情,我会很乐意讨论它:)

谢谢

尝试使用sys.stdin和readchar,但我没有找到实现此目的的好方法。

使用readchar,跟随字符列表并显示好东西(线程侧)有点复杂,并且它没有处理del键。

使用 sys.stdin 不可能逐个字符获取完整的命令。

python multithreading command-line-interface
1个回答
0
投票

以上是在多线程中使用锁定的一个很好的练习。您的实现没有任何问题,并且计算机肯定正在执行其应该执行的操作。

您的解决方案是建立一个锁,然后在正确的位置使用该锁(获取并释放它)。请记住,锁只是代码不同部分之间关于如何使用资源的协议。在这种情况下,资源是“屏幕”,解决方案是确保没有人在没有正确持有锁的情况下使用屏幕。

我试图在不完全放弃的情况下提出建议:)

这有帮助吗?

© www.soinside.com 2019 - 2024. All rights reserved.