使用python脚本进行一些线程处理,并在各种命令中吐出内容。但是,我想要打印出单个"剩余:x"在每个线程的末尾,然后在下一个print语句之前擦除该行。所以基本上,我试图实现一个进度/状态更新,在下一个print语句之前擦除它自己。
我有这样的事情:
for i in range(1,10):
print "Something here"
print "Remaining: x"
sleep(5)
sys.stdout.write("\033[F")
sys.stdout.write("\033[K")
当你按照它的方式打印时,这种方法很好用;但是,只要你实施线程,"剩余"文字并没有一直被消灭,有时你会得到另一个"这里的东西"就在它消除前一行之前。
需要一些帮助,试图找出使用多线程组织我的进度/状态文本的最佳方法。
感谢。
答案 0 :(得分:1)
由于您的代码不包含任何主题,因此很难就您的错误提供具体建议。
但是,如果它的输出顺序困扰你,你应该学习锁定,并让线程共享一个锁。想法是获取锁(所以没有其他人可以),发送输出并在释放锁之前刷新流。
然而,代码的结构化方式使得这很困难,因为当你有多个线程写输出时,无法保证光标总是会在特定位置结束。
答案 1 :(得分:0)
正如之前的评论者提到的,您可以使用互斥(RLock)对象来序列化访问。
import threading
# global lock
stdout_lock = threading.RLock()
def log_stdout(*args):
global stdout_lock
msg = ""
for i in args:
msg += i
with stdout_lock:
sys.stdout.write(msg)
for i in range(1,10):
log_stdout("Something here\n")
log_stdout("Remaining: x\n")
sleep(5)
log_stdout("\033[F")
log_stdout("\033[K")