在子流程中写入输出会导致错误

时间:2019-05-20 11:07:53

标签: python azure azure-web-sites python-multiprocessing

Keras强制输出到sys.stderr(对此修复未在GitHub上进行)。从Web App中的子进程写入系统输出似乎存在问题。这导致我的代码在导入Keras时尝试对后端实现进行inform时抛出适当的错误。

  

AttributeError: 'NoneType' object has no attribute 'write'

在实例化Flask应用程序并以this启动之前,我尝试根据web.config的答案将输出重定向到os.devnull。但是,错误仍然存​​在。奇怪的是,在没有multiprocessing的情况下编写输出效果很好。

import sys
from flask import Flask
import keras

app = Flask(__name__)


@app.route('/')
def main():
    print('Hello!')
    sys.stdout.write('test\n')
    sys.stderr.write('emsg\n')
    return 'OK.', 200

即使from keras import backend as k也有效。那就是最初产生错误的语句。这让我感到困惑。 可能是怎么回事?

最小示例

在我的应用程序中,生成了一个用于训练模型的子过程。尝试在multiprocessing.Process中写入输出时,将引发错误。这是重现这种情况的一些代码。

import sys
from flask import Flask
from multiprocessing import Process


def write_output():
    sys.stdout.write('hello\n')


def create_app():
    apl = Flask(__name__)
    Process(target=write_output).start()

    @apl.route('/')
    def main():
        return 'OK.', 200

    return apl

然后在另一个文件中实例化此应用程序,并从web.config进行调用。基本日志记录确认该错误仍在抛出。


几乎可以解决

尽管不是修复程序,但我使用threading使系统正常工作。只需将multiprocessing.Queue and Process切换为queue.Queuethreading.Thread,就不会抛出如上的错误。就我的用例而言,目前可以接受。当然,这不是解决在子进程中写入输出问题的解决方案。

1 个答案:

答案 0 :(得分:0)

我注意到您提到了Windows上Azure WebApp的web.config文件。您需要了解有关Azure Web App sandbox的限制。在根据您的情况进行审查后,我认为您的应用被某些限制所拒绝。根据我的经验,我认为训练模型的任务不适合在Azure WebApp上运行,特别是对于Windows实例,甚至不适合在基于CPU的沙箱上运行。

我的建议是将您的应用程序移至具有GPU的高性能Azure VM,例如https://azure.microsoft.com/en-us/pricing/details/virtual-machines/linux/上的NC-series

enter image description here

否则,您可能还有其他原因要对您的应用程序使用Azure WebApp,我建议您可以尝试基于Docker的Linux的Azure WebApp。

希望有帮助。