我正在使用一个^{
为了从Flask调用asyncio
协程,我开始使用^{
#!/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}$我做错什么了?在
原因:从子线程运行异步子进程有限制,请参阅asyncio docsSubprocess and threads。在
细节:使用
debug=True
,在由Werkzeug的run_with_reloader
启动的子线程中烧瓶aiohttp句柄请求。关闭调试,代码将正确运行。在或者根据上面的文档,flaskaiohttp应该在调用
run_with_reloader
之前添加对asyncio.get_child_watcher()
的调用。使用此调用,即使使用debug=True
,代码也会运行。在相关问题 更多 >
编程相关推荐