线程无干扰打印

时间:2015-07-11 08:17:05

标签: python multithreading

使用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")

当你按照它的方式打印时,这种方法很好用;但是,只要你实施线程,"剩余"文字并没有一直被消灭,有时你会得到另一个"这里的东西"就在它消除前一行之前。

需要一些帮助,试图找出使用多线程组织我的进度/状态文本的最佳方法。

感谢。

2 个答案:

答案 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")