以下代码几乎就是我所需要的。但是当第二个用户连接,新的subprocess.Popen创建时,我只需要运行一个subprocess.Popen并将相同的数据发送给多个用户。
示例:第一个用户连接,启动subprocess.Popen,他开始从数字0开始接收结果,当第二个用户连接30秒后,他开始从第30号开始接收结果。
#!/usr/bin/env python
import os
from functools import partial
from subprocess import Popen, PIPE
from flask import Flask, Response # $ pip install flask
file = 'test.file'
app = Flask(__name__)
@app.route('/' + file)
def stream():
process = Popen([ "bash", "-c", "for ((i=0;i<100;i=i+1)); do echo $i; sleep 1; done" ], stdout=PIPE, bufsize=-1)
read_chunk = partial(os.read, process.stdout.fileno(), 1024)
return Response(iter(read_chunk, b''), mimetype='audio/mp3')
if __name__ == "__main__":
app.run(host='0.0.0.0',threaded=True)
答案 0 :(得分:1)
说实话,我不确定这是否有用。我没有非常使用subprocess
模块,所以我不确定这是否是一个合适的用例。这个问题一般让我想起了烧瓶扩展。
我试图建议你使用与烧瓶扩展类似的模式......
将其存储在Flask global上,这是扩展开发的API建议。
编辑:通过文件名实现了您的路线,因此更改了密钥以反映
#!/usr/bin/env python
import os
from functools import partial
from subprocess import Popen, PIPE
from flask import Flask, Response, _app_ctx_stack as stack
file = 'test.file'
app = Flask(__name__)
def get_chunk(file):
ctx = stack.top
key = "read_chunk_%s" % file
if ctx is not None:
if not hasattr(ctx, key):
process = Popen(["bash", "-c", "for ((i=0;i<100;i=i+1)); do echo $i; sleep 1; done"],
stdout=PIPE, bufsize=-1)
setattr(ctx, key, partial(os.read, process.stdout.fileno(), 1024))
return getattr(ctx, key)
@app.route('/' + file)
def stream():
read_chunk = get_chunk(file)
return Response(iter(read_chunk, b''), mimetype='audio/mp3')
if __name__ == "__main__":
app.run(host='0.0.0.0',threaded=True)