python 螺纹不干扰打印

li9yvcax  于 2022-12-28  发布在  Python
关注(0)|答案(2)|浏览(133)

我正在用Python脚本进行线程处理,它会以各种顺序输出内容,但是,我想打印出一个"Remaining: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")

当你按原样打印出来的时候,这很好用;然而,一旦实现了线程化,"Remaining"文本就不会一直被清除,有时在它清除前一行之前,您会得到另一个"Something here"。
只是想找出用多线程组织我的进度/状态文本的最佳方法。

ycl3bljg

ycl3bljg1#

由于您的代码不包含任何线程,因此很难就您做错了什么给出具体的建议。
如果输出排序困扰着你,那么你应该学习锁,让线程共享一个锁,这样就可以获取锁(这样其他人就不能),发送你的输出,在释放锁之前刷新流。
但是,代码的结构化方式使这一点变得困难,因为当您有多个线程写入输出时,没有办法保证光标总是在特定位置结束。

p8ekf7hl

p8ekf7hl2#

正如前面的评论者提到的,您可以使用互斥锁(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")

相关问题