有两种可能性可以达到视频中两次运行的展示效果:
第一种(在后台线程中执行大模型推理代码,打印报错是主线程中的信息,捕获异常之后通过旗标通知后台线程停止计算):
import time
import traceback
from threading import Thread
import cv2
import torch
running = True
print = lambda *args, **kwargs: __builtins__.print(' '.join(map(str, args)) + '\n', end='', **kwargs)
def ModelInference(prompt, save_path):
# 通过旗标传递推理程序是否中途退出
global running
# 检查推理是否已经启动
print('[INFO] 开始执行模型推理:', (prompt, save_path))
start_time = time.time()
while True:
if not running:
print('[INFO] 按下Ctrl-C介入退出')
return
# 模拟AI计算代码,耗时略大于6秒
img = ...
if time.time() - start_time > 6.2:
break
# 将推理图片写入路径
cv2.imwrite(img, save_path)
# 检查推理是否运行结束
print('[INFO] 运行输出结果完毕')
if __name__ == '__main__':
# 等待用户输入提示词信息
prompt = input('>>> ')
save_path = '/home/demo/output.jpeg'
# 发起后台线程,运行推理任务,并将参数传递给后台线程
th = Thread(target=ModelInference, args=(prompt, save_path))
th.start()
# 捕获Ctrl-C异常,避免按下Ctrl-C后主线程退出,但是后台线程继续执行任务
try:
# 错误信息显示就是打印在这里
time.sleep(6)
except KeyboardInterrupt:
# 通过设置全局变量,传递AI推理线程中途退出的信号
running = False
# 打印异常信息,因为图示中有报错显示
traceback.print_exc()
# 阻塞主线程直到后台线程运行结束,因为视频中主线程没有立刻运行结束
th.join()
第二种(这个太简单了,华为运行的肯定不是这一种):
import time
input('>>> ')
time.sleep(6)
with open('/home/demo/output.jpeg', 'wb') as f:
f.write(b'...')