如何定期返回python函数的stdout?

时间:2017-02-14 22:34:56

标签: python

我从一个主函数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

1 个答案:

答案 0 :(得分:0)

当然可以做到。问题是它应该有多复杂; - )

进度输出的最佳方法是调整长时间运行的例程,以便它自己执行此输出。例程是信息存在的地方,已经完成了多少以及还有多少,所以没有其他人可以像例行程序那样精确。例程可以被赋予特殊的stream(例如,打开文件句柄)以将进度信息放入其中。您作为调用者然后可以简单地传递sys.stderr或类似。

但如果你不愿意或无法改变你的惯例,那么让我们面对它:你想要并行做两件事:

  1. mainFunc()功能和
  2. 调用例程
  3. 进度输出。
  4. 在一个进程中并行处理您使用线程。所以

    1. 开始你的进度线程,每30秒打印一些进度输出,
    2. 开始你的日常工作,
    3. 完成例程后,
    4. 表示线程自行终止。
    5. 如果这是你想要解决问题的方式,我可以在这里详细说明。