使用flaskaiohttp的异步子进程

2024-04-24 13:31:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个^{}web服务器来提供一个到耗时计算的接口。为了提高性能,我想

  1. new subprocess的形式开始计算,以便能够使用多个CPU内核进行多个并发计算
  2. 让计算使用^{}异步运行

为了从Flask调用asyncio协程,我开始使用^{},这对于简单的延迟任务非常有效,如示例所示。 但是,我无法从Flask内部调用异步子进程:

#!/usr/bin/env python3
# coding: utf-8

from flask import Flask
from flask.ext.aiohttp import AioHTTP, async

import asyncio
from asyncio.subprocess import PIPE

CALC_SCRIPT = './calc'

app = Flask(__name__)
aio = AioHTTP(app)

@app.route('/calc/<int:n>')
@async
def calc(n):
    print('calc({}) called'.format(n))
    create = asyncio.create_subprocess_exec(CALC_SCRIPT, str(n),
                                            stdout=PIPE, stderr=PIPE)
    print('create... ', end='')
    process = yield from create
    print('process created. {!r}, type={}'.format(process,
                                                  type(process)))
    yield from process.wait()
    print('process finished.')

    # yields (stdout, stderr)
    result = '\n'.join(ch.decode().rstrip() for ch in
                        (yield from process.communicate()) if ch)
    return result

if __name__ == '__main__':
    aio.run(app, debug=True)

正在创建进程,但从未返回:

^{pr2}$

我做错什么了?在


Tags: fromimportasyncioappflask进程createcalc
1条回答
网友
1楼 · 发布于 2024-04-24 13:31:10

原因:从子线程运行异步子进程有限制,请参阅asyncio docsSubprocess and threads。在

细节:使用debug=True,在由Werkzeug的run_with_reloader启动的子线程中烧瓶aiohttp句柄请求。关闭调试,代码将正确运行。在

或者根据上面的文档,flaskaiohttp应该在调用run_with_reloader之前添加对asyncio.get_child_watcher()的调用。使用此调用,即使使用debug=True,代码也会运行。在

相关问题 更多 >