打印功能能否在 GCE 应用程序中可靠地使用?

Can the print function be used reliably in GCE apps?

我有一个 GCE 应用程序,它由一个 Python 脚本组成,该脚本具有一些长 运行 函数(其中大部分是查询数据库并将结果发送到某处)。似乎当脚本挂起这些较长的 运行 任务之一时,没有任何内容打印到 Stackdriver Logging, 甚至 print() 脚本挂起位置之前的语句 .这似乎是 Compute Engine 或 Stackdriver 中的错误,使调试脚本变得非常困难(例如,我看不到最后一个成功的 print 语句发生在哪里)。

我希望只修复此错误,而不必添加 logging 模块,因为设置它似乎需要大量开销。

根据 this answer from unix.stackexchange.com,当进程的输出被重定向到终端以外的其他东西时,操作系统可能会将输出临时存储在缓冲区中。缓冲输出通过减少系统调用和 IO 操作的数量来提高效率。

可以从 python 脚本或应用程序中手动刷新缓冲输出。

  • 在 python3 中,在 print 函数上设置 flush 标志。
    • print('foo', flush=True)
  • 在python2中,打印后刷新sys.stdout
    • print 'foo'; sys.stdout.flush()