2015-07-11 74 views
0

使用python脚本进行一些线程处理,并在各种命令中吐出东西。但是,我想在每个线程的末尾打印出一个“Remaining:x”,然后在下一个打印语句之前删除该行。所以基本上,我试图实现一个进度/状态更新,在下一个打印语句之前自行消除。线程不干扰打印

我有这样的事情:

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

'sys.stdout'被缓冲。你可以调用'sys.stdout.flush()',并希望在从另一个线程写入之前调用它 - 但不能保证。 –

+0

嗯好的。谢谢您的帮助! – LewlSauce

+0

以及解决该问题的正确方法(与多于一个线程使用的任何资源一样)是锁定:https://docs.python.org/2/library/threading.html#lock-objects –

回答

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