跳到主要内容
版本:1.2.2

安全关闭镜像(mirror)

使用LineProcBufferLineHostBuffer的时候,需要使用镜像(mirror)。前文中,已经解释了如何透过继承LineProcBuffer来捕获进度。在那个例子中,需要透过如下做法、将pbuf.wait移到背景运行:

...
thd = threading.Thread(target=pbuf.wait, daemon=True)
thd.start()
print("开始等待。")
while pbuf.progress < 100:
...
time.sleep(0.1)
print("进度达到100%。")
thd.join()
...

要确保所有的子进程安全结束,需要使用thd.join来等待pbuf.wait终结。然而,某些情况下,需要在子进程完成之前,提前中断之。使用terminate方法固然是一种可行思路,不过,这样的中断可能不够安全。更好的做法是向子进程发送关闭信号。当子进程尝试写入新的信息时,它会检查关闭信号。若检测到了关闭信号,则会抛出StopIteration异常。例如,若将以上代码修改如下:

thd = threading.Thread(target=pbuf.wait, daemon=True)
thd.start()
print("开始等待。")
prog = pbuf.progress
while prog < 100:
time.sleep(0.1)
prog = pbuf.progress
if prog > 10:
pbuf.stop_all_mirrors()
break
print("进度未达到100%。")
thd.join()
print("最终进度:{0}%".format(pbuf.progress))

则子进程会提前中断。相应地,buffer也无法接收到子进程的正常终结信息。取而代之的是,捕获到来自子进程的StopIteration异常。