线程中的raw_input和print

3 投票
3 回答
6954 浏览
提问于 2025-04-17 10:14

我有一个线程可以在控制台上打印一些文字,而主程序中有一个 raw_input 用来控制这个线程。

我的问题是,当我在输入的时候,线程也在打印,这样就会出现类似下面的情况:

-->whatiwWHATTHETHREADWRITErite

但我希望能得到像这样的效果:

WHATTHETHREADWRITE
-->whatiwrite

3 个回答

-1

可以使用类似于 curses 这样的工具,把后台任务的输出写到屏幕的一半,而把你的输入或控制内容放在另一半。

你还可以在大多数终端上玩弄一下 ANSI 转义码

4

你可以创建一个锁,然后在持有这个锁的情况下进行所有的输入和输出操作:

import threading

stdout_lock = threading.Lock()

with stdout_lock:
    r = raw_input()

with stdout_lock:
    print "something"
2

你需要让你的输入和线程的输出保持同步,避免它们同时发生。

你可以这样修改主循环:

lock = threading.lock()

while 1:
    raw_input()     # Waiting for you to press Enter
    with lock:
        r = raw_input('--> ')
        # send your command to the thread

然后锁定后台线程的打印:

def worker(lock, ...):
    [...]
    with lock:
        print('what the thread write')

简单来说,当你 按下回车 时,你会停止线程并进入“输入模式”。

更具体一点,每次你 按下回车 时,你会:

  • 等待锁可用
  • 获取锁
  • 打印 --> 并等待你的命令
  • 输入你的命令
  • 将命令发送给线程
  • 释放锁

所以你的线程 只有在你处于“输入模式”时尝试打印时才会被停止
在你的终端上你会看到类似这样的内容:

some previous output

---> your input
THE THREAD OUTPUT

撰写回答