繁体   English   中英

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

[英]Writing output in a sub-process leads to error

Keras强制输出到sys.stderrGitHub上的修复被拒绝)。 从Web应用程序中的子进程写入系统输出似乎存在问题。 这导致我的代码在导入Keras时尝试通知后端实现时抛出了相应的错误。

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

在实例化Flask应用程序并使用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 ,不会抛出上述错误。 对于我的用例,这是可以接受的。 当然,它不是解决在子进程中编写输出的问题。

我注意到您在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

在此输入图像描述

否则,您可能有其他理由将Azure WebApp用于您的应用程序,我建议您可以尝试基于Docker的Azure WebApp for Linux。

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM