我从一个主函数mainFunc调用了几个函数(使用flask模块将其公开为Restful服务)。执行可能需要几分钟到一个小时才能完成,并且要求每30秒显示一次进度(被调用函数的输出)。由于Rest API调用是从另一个程序调用到mainFunc()所以它应该在每次调用时返回输出(即当前状态)。
我按照How to capture stdout output from a Python function call?尝试了yield和StringIO但是无法使其工作,stdout仅在完成所有任务时返回,而不是在两者之间。请建议是否可以这样做。
mainFunc():
runs_for_5_mins()
runs_for_30_mins()
...
return output
答案 0 :(得分:0)
当然可以做到。问题是它应该有多复杂; - )
进度输出的最佳方法是调整长时间运行的例程,以便它自己执行此输出。例程是信息存在的地方,已经完成了多少以及还有多少,所以没有其他人可以像例行程序那样精确。例程可以被赋予特殊的stream
(例如,打开文件句柄)以将进度信息放入其中。您作为调用者然后可以简单地传递sys.stderr
或类似。
但如果你不愿意或无法改变你的惯例,那么让我们面对它:你想要并行做两件事:
mainFunc()
功能和在一个进程中并行处理您使用线程。所以
如果这是你想要解决问题的方式,我可以在这里详细说明。